【问题标题】:Stored Procedures and EF Code First存储过程和 EF 代码优先
【发布时间】:2011-04-04 20:38:59
【问题描述】:

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

  1. 我必须使用 SqlCommand 吗?

  2. 那么复杂的属性呢,它们也会被解析吗?

  3. 还有其他限制可以告诉我吗?

谢谢!

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我明白了。但是有没有我可以使用的 SQL 阅读器?
    • 没有。它将在内部处理对象的具体化。
    • 你提到的问题已经有一年多了。你确定它在 CTP5 中仍然是相同的限制吗?
    • CTP5 版本过时。当前版本是 EF 4.1RC,但它只是 EFv4 的包装。此外,EF 4.1RC 是简化的 API,不包含某些功能。映射存储过程就是这些特性之一。所以是的,它仍然是一样的。
    • 那我该怎么办?我想在我的项目中使用 EF CF 进行许多检索操作,但我必须单独使用 SP。我可以使用 EF 用于处理 ADO.NET DataReaders 的相同连接吗?
    【解决方案2】:

    Stored Procedures are not supported in Code First。因此,是的,如果您打算使用 Code First,则必须使用 SqlCommand 或您选择的数据库提供的任何内容。

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

    【讨论】:

      【解决方案3】:

      【讨论】:

        【解决方案4】:

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

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

        希望有帮助

        【讨论】:

          猜你喜欢
          • 2014-12-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-17
          相关资源
          最近更新 更多