Upgrade from EF 4.0 ObjectContext to EF 6 / 6.1

本文关键字:EF to from Upgrade ObjectContext | 更新日期: 2023-09-27 18:18:11

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

我已经(成功地)完成了实际升级EDMX的所有步骤(添加T4模板,更改命名空间引用等),现在我的数据访问程序集正在编译良好。

为了快速完成任务,我使用ObjectContext T4模板来执行升级,希望最小化所需的代码更改。我使用的模板是"EF 6"。整个解决方案仍将基于。net Framework 4.0。

我想知道在EF6中使用ObjectContext而不是DBContext是否会减少或限制新的EF6的好处(我将继续使用数据库优先策略)。

Upgrade from EF 4.0 ObjectContext to EF 6 / 6.1

首先要考虑的是,微软将从EF7开始放弃对ObjectContext的支持,所以如果你打算升级,现在就可以做了。

从正常编码的角度来看,DbContext和ObjectContext并没有什么不同。大多数东西都是一样的。DbContext有更长的启动时间,因为它必须编译模型,但你也可以把预编译视图加快。

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

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

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

在大多数地方,推荐使用DbContext。因为它会一直存在。ObjectContext及其对应的EntityObject已弃用

DbContext只是一个(好的)围绕ObjectContext的包装器,它使相当容易的代码优先,允许您轻松使用POCO,并且通常使用它构建数据层更方便。但本质上,利用DbContext的代码在底层仍然使用相同的ObjectContext功能。

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

Entity Framework 6带来了一些在代码使用方面不可见的好处,比如改进的性能和bug修复。使用Context中的任意一个,你都会自动得到这些。

编辑

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

Entity Framework 7公告指出了即将到来的重大变化(包括新的平台和数据存储支持),这些变化对你的情况可能有用,也可能没用。

这实际上意味着你应该仔细考虑你现在和将来的目标是什么。