【问题标题】:Upgrade from EF 4.0 ObjectContext to EF 6 / 6.1从 EF 4.0 ObjectContext 升级到 EF 6 / 6.1
【发布时间】:2014-08-15 10:36:34
【问题描述】:

我想将一个基于 FX 4.0 和 EF 4.0(Database First with ObjectContext)的非常大的项目升级到最新的 6/6.1 版本的 EF。

我已经(成功地)完成了实际升级 EDMX 的所有步骤(添加 T4 模板、更改命名空间引用等,遵循这篇文章 Upgrade EF 4 EDMX to EF 6),现在我的数据访问程序集正在编译。

为了快速完成任务,我使用 ObjectContext T4 模板执行升级,希望将所需的代码更改降至最低。我使用的模板是 Visual Studio Gallery 中的“EF 6.x EntityObject Generator 模板”,整个解决方案仍将基于 .Net Framework 4.0。

我想知道在 EF6 中使用 ObjectContext 而不是 DBContext 是否会减少或限制新 EF 6 的好处(我将继续使用 Database First 策略)。

【问题讨论】:

    标签: c# .net entity-framework


    【解决方案1】:

    首先要考虑的一点,Microsoft 从 EF7 开始放弃对 ObjectContext 的支持,所以如果您打算升级,现在就可以进行。

    从正常编码的角度来看,DbContext 或 ObjectContext 并没有那么不同。大多数情况下,一切都是相同的。 DbContext 的启动时间稍长,因为它必须编译模型,但您也可以放置预编译的视图以加快速度。

    DbContext 很好地连接了 DataAnnotation Validations,它支持基于快照的更改检测,与 ObjectContext 相比实际上提高了性能。

    如果您使用重度反射,那么您会遇到问题,因为在运行时,对象是从运行时代理而不是您声明的类派生的。所以它需要一点工作。我们有类似的东西,但是我们在每个类上都放了一个接口,以实际检索正确的反射类型。

    DbContext 还将支持非数据库连接,例如 Azure 表存储或您自己的任何自定义存储。

    几乎所有地方都推荐使用 DbContext。因为它会留下来。 ObjectContext 及其对应的 EntityObject 已被弃用。

    【讨论】:

      【解决方案2】:

      DbContext 只是 ObjectContext 的一个(很好的)包装器,它支持相当简单的 Code First,它允许您轻松地使用 POCO,并且通常使用它构建数据层更方便。但本质上,使用 DbContext 的代码仍然在下面使用相同的 ObjectContext 功能。

      此外,与 ObjectContext 相比,DbContext 有一些限制:例如,使用 DbContext 的 StoredProcedures 没有开箱即用的支持(CUD 操作的存储过程除外),因此无论如何您都必须回退到 ObjectContext。

      Entity Framework 6 带来了一些在代码使用方面不可见的好处,例如 - 改进的性能和错误修复。您将使用任一 Context 自动获取这些内容。

      编辑

      就个人而言,我完全赞成使用 DbContext,因为它现在是一种“推荐”(事实上,是唯一受支持的)方式,但如果您有一个非常大的数据库模型(有很多表、SP 等) ) 和依赖它的代码库,迁移到 DbContext 将需要您对数据层进行重大更改,这不会在短期内为您带来好处。但它肯定会改善您的系统设计,并让您在未来获得长期的改进。

      Entity Framework 7 announcement 表示即将发生重大变化(包括新平台和数据存储支持),这可能对您的情况有用,也可能没用。

      这实际上意味着您应该仔细考虑您现在和未来的目标。

      【讨论】:

        猜你喜欢
        • 2013-10-30
        • 2012-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多