在CodeFirst 4.1中执行StoredProcedure

use*_*923 5 stored-procedures entity-framework ef-code-first entity-framework-4.1

我理解存储过程映射不支持我的理解是我应该能够调用存储过程.

我有很多复杂的存储过程,设计师我可以创建一个复杂的类型,我一切都很好.

现在在代码中首先让我假设我有以下存储过程,只是把一些愚蠢的东西放在一起给出一个想法.我想找一个有1个地址的学生.

在代码中我有一个学生和地址实体.但不,StudentAddressEntity因为它是一个链接表.

我试过以下但是我收到了一个错误

'.'}
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
Run Code Online (Sandbox Code Playgroud)

C#代码:

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

那里有任何例子如何调用sp并首先在代码中填充complexType,使用参数等.我可以挂钩到ADO.NET吗?

尝试只返回没有参数的所有学生的SP我得到了这个错误

System.SystemException =无法为"CodeFirstPrototype.Dal.Address"类型的属性"StudentAddress"创建值.仅支持具有基本类型的属性.

是因为我在某种程度上忽略了链接表吗?

有什么建议?

Lad*_*nka 7

我相信你的例外实际上是:

','附近的语法不正确.

因为这是无效的陈述:"GetStudentById,@StudentID".应该没有逗号:"GetStudentById @StudentID".

EF中存储过程的问题是它们不支持加载导航属性.EF将仅实现主实体,并且不会加载导航属性.这例如通过EFExtensions解决.EFExtensions用于ObjectContext API,因此您必须检查它是否也可用于DbContext API.