存储过程和EF代码优先

时间:2011-04-04 20:39:00

标签: entity-framework stored-procedures entity-framework-4.1

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

  1. 我必须使用SqlCommand吗?

  2. 复杂属性如何解决?

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

  4. 谢谢!

4 个答案:

答案 0 :(得分:6)

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

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

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

DbContext API不提供任何功能导入,如EDMX和ObjectContext API。

答案 1 :(得分:5)

Stored Procedures are not supported in Code First。所以是的,如果你打算使用Code First,你将不得不使用SqlCommand或你选择的任何数据库。

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

答案 2 :(得分:0)

答案 3 :(得分:0)

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

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();

希望这个帮助