存储过程和EF Code First

11

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

  1. 我必须使用SqlCommand吗?

  2. 答:是的,你需要使用SqlCommand来执行存储过程并获取数据。
  3. 那复杂属性呢,它们也会被解析吗?

  4. 答:是的,复杂属性也会被解析并返回相应的值。
  5. 还有其他限制可以告诉我吗?

  6. 答:没有其他明显的限制,但请注意存储过程是否正确地返回所需的实体数据。

谢谢!

4个回答

6

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

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

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

DbContext API没有像EDMX和ObjectContext API那样提供任何函数导入的功能。


我明白了。但是有没有我可以使用的SQL Reader呢? - user342552
您所提到的问题已经超过一年了。您确定在 CTP5 中仍然存在相同的限制吗? - user342552
CTP5已经过时了。当前版本是EF 4.1RC,但它只是EFv4的包装器。此外,EF 4.1RC是一个简化的API,不包含一些功能。映射存储过程就是其中之一。所以是的,它仍然是一样的。 - Ladislav Mrnka
那我该怎么办呢? 我想在我的项目中使用EF CF进行许多检索操作,但我必须单独使用SP。我能否使用EF使用的相同连接来使用ADO.NET DataReaders? - user342552
@Nazaf - 在EF 4.1中,你可以很容易地使用DB First或Model First生成POCOs。你只需要将代码生成器更改为他们提供的新DBContext,就可以开始了。 - Tridus
显示剩余3条评论

5

存储过程在Code First中不受支持。因此,如果您打算使用Code First,则必须使用SqlCommand或您选择的任何数据库提供程序。

存储过程在DB First或Model First中得到支持。


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

希望这可以帮到你



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接