迁移到实体框架自定义 ORM
Posted
技术标签:
【中文标题】迁移到实体框架自定义 ORM【英文标题】:Migrating to Entity Framework custom ORM 【发布时间】:2011-11-08 03:02:29 【问题描述】:我们目前有一个完全用 ASP.NET 和 MVC 手工编写的解决方案。
目前 DAL 中有很多丑陋的 hack 和变通方法,我没有对这些 hack 进行扩展,而是设法说服了我们需要迁移到某种 ORM 的诉讼。
凭借团队中的 Entity Framework 经验,我们决定使用 Entity Framework,但是,对于任何可能有此经验的人,我有一个迁移问题。
如果我们要逐个迁移实体,直到所有内容都迁移到 EF,会不会出现任何性能问题?我们会面临哪些可能的障碍(除了必须重写大部分 BL 的明显障碍)?应该逐个实体地完成(就创建模型而言)还是创建实体模型并逐位更改 BL 会出现问题。
我似乎找不到关于这个主题的任何文档。MSDN 似乎只是说“Yay Entity Framework 很好,所以迁移到它很好。”。
任何建议将不胜感激。
PS:我确实读过这个:Migrating from 'native' OODBMS to ORM (Entity Framework / SQL Server)
但是,由于我们决定使用 EF 而不是 NHibernate,它并没有被证明很有用。
【问题讨论】:
【参考方案1】:这是个好问题,我有一个来自我的预期的答案。这是关于“Yay Entity Framework 很好,所以迁移到它很好”
现在我们的团队正在研究大型(非常大型)人力资源 SaaS 解决方案。从一开始我们就决定使用:
EF 4.1 mysql(这是客户端的要求) .NET MVC 3然后时间过去了(近 3 周),我们接下来注意到关于 EF:使用 Model first 在我们的系统中不适用和有用,以防将来我们需要时难以支持系统,例如,更改一点 db 结构或在表之间建立新的关系。
在这种情况下,我们迁移到 EF Code First(为所有数据库请求提供一个通用存储库)。这就是风险,因为它是如此新技术,并且没有关于大型解决方案的最佳实践或用例。结果我们收到了很多其他的麻烦:
ORM 发出大量数据库请求(导致表之间存在大量关系)。由 .Include() 修复 POCO 对象的动态代理 - 造成了很多麻烦,导致来自 db 的代码优先实体不像请求的实体类型 - 像动态代理类型。因此,当我们尝试对它们进行序列化并将其放入 Memcached 进行反序列化时,我们会收到此实体在当前上下文中不再可用的错误。像这样固定:http://msdn.microsoft.com/en-us/library/dd456853.aspx 和这个:http://blogs.dotnetkicks.com/dpeterson/2011/08/11/theres-a-proxy-in-my-boots-entity-framework-poco/ 带有会员资格的愚蠢包发送了许多令人难以置信的请求。通过审查我们与会员的工作来修复我们还尝试了 NHibernate 来比较性能。 NHiberate 也一样 :)
您应该了解的有关 EF 的一般信息:
如果您想附加第 3 部分缓存,请准备好解决方法。 NHibernate 对此进行了原生集成 EF 和 Nh 的性能没有太大区别,但 Nh 在映射方面有很多手工工作希望我能回答您的问题,并且信息与您相关。
ps> 对不起我的英语:)
【讨论】:
+1;我已经看到了所有这些问题,很高兴你能指出它们。在我们的例子中,我们试图将实体序列化为 Telerik UI 控件。他们使用 JsonSerializer,它也不能处理实体序列化(我们通过做一个奇怪的包装器来修复它,当检测到对象周期时截断序列化)。 有一个插件为 NHibernate 提供流畅的基于语法代码的映射支持:fluentnhibernate.org。虽然正如你所说,你基本上已经达到了与 EF 相提并论的水平,因为没有性能差异。 顺便说一句,ORM made a lot of db requests (cause of a lot of relations between tables). Fixed by .Include()
我不认为是由代码优先引起的。我也看到了模型优先的这个问题。但我同意你的说法,即模型优先支持真的一点也不顺利。它将在下一个 VS 版本(Denali)中,但还没有。
but Nh have a lot of hand work with mapping
。 False 你得到了流畅的 nhibernate 和免费的 GUI,例如 nmg.codeplex.com。恕我直言,nhibernate 生成的错误消息比 EF 中的错误消息要好得多。无论如何都要为所有 EF 点 +1。
关于 Nh 我同意你们(所有人)提供的组件,但是更改 ORM 会使我们在现成的解决方案中重写大量代码时遇到问题以上是关于迁移到实体框架自定义 ORM的主要内容,如果未能解决你的问题,请参考以下文章
在快速自定义的NopCommerce中使用实体框架(EF)代码优先迁移