问题 存储过程和EF代码优先


我想使用存储过程从数据库中检索实体,我不关心跟踪更改。我只需要解决所有实体,包括相关实体。

  1. 我必须使用SqlCommand吗?

  2. 那些复杂的属性,它们也会得到解决吗?

  3. 您可以告诉我任何其他限制吗?

谢谢!


4643
2018-04-04 20:38


起源



答案:


关于在EF中使用存储过程的一般答案是 这里 所以纯EF中的存储过程不会处理导航属性。答案也提到了 EFExtensions 但这在DbContext API中不可用。

要在DbContext API中执行存储过程,请使用:

var entities = context.Database.SqlQuery<MyEntity>(...);

DbContext API不提供任何函数导入,如EDMX和ObjectContext API。


6
2018-04-04 20:49



我懂了。但是我可以使用SQL Reader吗?
不会。它将在内部处理对象的实现。 - Ladislav Mrnka
你提到的问题是一年多了。你确定在CTP5中仍然有相同的限制吗?
CTP5是过时的版本。当前版本是EF 4.1RC,但它只是EFv4的包装。此外,EF 4.1RC是简单的API,不包含某些功能。映射存储过程具有这些功能。所以是的,它仍然是一样的。 - Ladislav Mrnka
那我该怎么办?我想在我的项目中使用EF CF进行许多检索操作,但我必须单独使用SP。我可以使用EF用于处理ADO.NET DataReaders的相同连接吗?


答案:


关于在EF中使用存储过程的一般答案是 这里 所以纯EF中的存储过程不会处理导航属性。答案也提到了 EFExtensions 但这在DbContext API中不可用。

要在DbContext API中执行存储过程,请使用:

var entities = context.Database.SqlQuery<MyEntity>(...);

DbContext API不提供任何函数导入,如EDMX和ObjectContext API。


6
2018-04-04 20:49



我懂了。但是我可以使用SQL Reader吗?
不会。它将在内部处理对象的实现。 - Ladislav Mrnka
你提到的问题是一年多了。你确定在CTP5中仍然有相同的限制吗?
CTP5是过时的版本。当前版本是EF 4.1RC,但它只是EFv4的包装。此外,EF 4.1RC是简单的API,不包含某些功能。映射存储过程具有这些功能。所以是的,它仍然是一样的。 - Ladislav Mrnka
那我该怎么办?我想在我的项目中使用EF CF进行许多检索操作,但我必须单独使用SP。我可以使用EF用于处理ADO.NET DataReaders的相同连接吗?


Code First不支持存储过程。所以是的,如果您打算使用Code First,您将不得不使用SqlCommand或您选择的任何数据库。

DB First或Model First支持存储过程。


5
2018-04-04 20:52





尝试功能导入: http://msdn.microsoft.com/en-us/library/dd456824.aspx


0
2018-04-04 20:44





通过查看数据库第一种方法,在自动生成的上下文类中,它将存储过程定义为虚函数,这里我从我的项目共享一个函数,这个存储过程返回一个复杂类型的问题。

public virtual ObjectResult<Question> GetMyInnerQuestions(Nullable<int> id)
        {
            var idParameter = id.HasValue ?
                new ObjectParameter("Id", id) :
                new ObjectParameter("Id", typeof(int));

            return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<Question>("GetMyInnerQuestions", idParameter);
        }

我在我的代码中首先使用它,我可以调用存储过程,如:

IQueryable<Question> questions = db.GetMyInnerQuestions(id).AsQueryable();

希望这有帮助


0
2017-10-17 09:21