5

Entiendo que el mapeo de procedimientos almacenados no es compatible con mi entendimiento de que debería poder llamar a procedimientos almacenados.Ejecutar StoredProcedure en CodeFirst 4.1

Tengo bastantes procedimientos almacenados complejos y con el diseñador podría crear un tipo complejo y estaba todo bien.

Ahora en el código primero supongamos que tengo el siguiente procedimiento almacenado, solo junte algo tonto para dar una idea. Quiero devolver un estudiante con 1 dirección.

En el código tengo una entidad de estudiante y dirección. Pero no StudentAddressEntity ya que es una tabla de enlaces.

He intentado el siguiente pero me da un error

sintaxis incorrecta cerca'. "}
System.Data.Common.DbException {} System.Data.SqlClient.SqlException

ALTER Procedure [dbo].[GetStudentById] 
    @StudentID int 
AS 
    SELECT * 
    FROM Student S 
    left join StudentAddress SA on S.Studentid = sa.studentid 
    left join Address A on SA.AddressID = A.AddressID 
    where S.StudentID = @StudentID 

código C#:

using (var ctx = new SchoolContext()) 
{ 
    var student = ctx.Database.SqlQuery<Student>("GetStudentById,@StudentID", 
               new SqlParameter("StudentID", id)); 
} 

Cualquier ejemplo de cómo llamar sp y completar primero un tipo complejo de código, usando parámetros, etc. ¿Puedo conectar ADO.NET?

Tratando sólo un SP que devuelve todos los estudiantes sin parámetros que recibo este error

System.SystemException = No se puede crear un valor para la propiedad 'StudentAddress' de tipo 'CodeFirstPrototype.Dal.Address'. Solo las propiedades con tipos primitivos son compatibles con .

¿Es porque de alguna manera ignoro la tabla de enlaces?

¿Alguna sugerencia?

Respuesta

7

creo que su realidad es una excepción:

sintaxis incorrecta cerca ''.

porque esta es la declaración inválida: "GetStudentById,@StudentID". Debería ser sin coma: "GetStudentById @StudentID".

El problema con los procedimientos almacenados en EF es que no son compatibles con la carga de las propiedades de navegación. EF materializará solo la entidad principal y las propiedades de navegación no se cargarán. Esto se resuelve, por ejemplo, por EFExtensions. EFExtensions son para ObjectContext API, por lo que deberá verificar si también se puede usar para DbContext API.

+0

Gracias por su reply.That trabajó – user712923

0

Usando EFExtentions que se verá algo así como

using (var context = new SchoolContext()) 
{ 
    var command = context.CreateStoreCommand("GetStudentById", CommandType.StoredProcedure, 
     new SqlParameter("StudentID", id)); 

    using (command.Connection.CreateConnectionScope()) 
    using (var reader = command.ExecuteReader()) 
    { 
     // use the reader to read the data 
     // my recommendation is to create a Materializer using EFExtensions see 
     // http://blogs.msdn.com/b/meek/archive/2008/03/26/ado-entity-framework-stored-procedure-customization.aspx 

     // ex 
     var student = Student.Materializer.Materialize(reader).SingleOrDefault(); 

     return student; 
    } 
} 
Cuestiones relacionadas