【问题标题】:Compare Entity Framework 4 objects to ADO.NET C# POCO Entity Generator objects将 Entity Framework 4 对象与 ADO.NET C# POCO Entity Generator 对象进行比较
【发布时间】:2011-07-26 06:20:30
【问题描述】:

我真的有两个问题:

  1. Entity Framework Entity 对象和 ADO.NET C# POCO Entity 之间有什么区别。
  2. 我是否使用以下正确的存储库更新记录?

如果您关闭代码生成,然后添加 ADO.NET C# POCO Entity Generator,它会为您的 Entity Framework 4 对象提供一个很好的类表示。这个想法是(from here):

The POCO Template can be used to generate persistence ignorant entity types 
from an Entity Data Model.

但是,这些对象具有对象之间的关系以及返回数据库的链接。例如,您可以从存储库中拉出一个,对其进行更改,然后在存储库或工作单元级别保存更改,并将内容保存到数据库中。

所以我的问题是原生实体框架对象与使用此工具生成的这些 POCO 有什么不同?

这是我在使用存储库更新记录时的想法。这是错的吗?

  1. 从存储库请求 POCO。
  2. 存储库从数据上下文加载记录,为找到的每条记录创建一个新 POCO,将值从 Entity Framework 对象复制到 POCO,并返回新 POCO 的集合。
  3. 在存储库之外对这些 POCO 进行更改,然后使用 Save(POCO) 之类的方式将 POCO 提交回存储库。
  4. 存储库从数据库加载匹配记录并将 POCO 属性复制到实体框架对象。
  5. 使用存储库对象或工作单元对象调用 Save。

【问题讨论】:

    标签: entity-framework-4 poco


    【解决方案1】:

    在 POCO 生成器的情况下,生成的实体类(例如,Employee、Company 等)不会派生自任何特殊类(因此称为 Plain Old)。 而在实体对象生成器的情况下,实体类派生自特殊的“实体对象”类,它提供了某些功能。

    拥有 POCO 类的目的是消除实体对数据库的特定关注。从而使我们的域模型不知道 DB/持久性操作。

    【讨论】:

    • 例如,在 NHibernate 中,您是否从存储库中拉出 POCO,对其进行修改,然后调用不带参数的 Repo.Save() 将更改后的 poco 保存到磁盘?如果这是任何给定 ORM 的规范,那没关系,但对我来说,它似乎高度依赖于 EF。
    【解决方案2】:

    POCO 意味着您有一个普通的旧 CLR 类,它不会被与持久性相关的特殊构造污染。实体对象派生自EntityObject类,它们使用了很多与实体框架直接相关的类和属性。使用 EntityObjects 时,您的代码完全依赖于实体框架。

    您在存储库中描述的内容已在 EFv1 中用于实现 POCO 方法。目前您可以直接使用 POCO。 POCO 与数据库没有任何关系。在某些情况下,POCO 由依赖于 EF 的构造动态代理,但这会在运行时发生,因此不会污染您的代码。

    【讨论】:

    • 我得到了 POCO 部分,但是如果来自 Repository 的最终结果对象与 EF 对象相同,为什么要使用它?
    • 它与 EF 对象不同。或者我不明白你的意思。
    • 例如,它现在加载了关系作为属性。如果你序列化它,你会得到循环引用错误。这让我相信 MVC 3 序列化有一些选项可以排除某些属性......嗯
    猜你喜欢
    • 2011-03-31
    • 2012-03-25
    • 1970-01-01
    • 2011-01-06
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 2017-11-30
    • 2010-11-04
    相关资源
    最近更新 更多