【问题标题】:Creating POCO classes that are compatible with NHibernate and EF 4.1创建与 NHibernate 和 EF 4.1 兼容的 POCO 类
【发布时间】:2011-06-03 15:16:44
【问题描述】:

我知道 NHibernate 的 POCO 类的所有成员都必须定义为虚拟的,并且在 EF(代码优先)中,您只需将集合/引用对象设置为虚拟即可进行延迟加载。

所以如果我想创建与 EF 和 NH 兼容的 POCO 对象,我是否应该将我的 POCO 类的每个成员都声明为虚拟的??

想要这样做的原因是我们目前正在评估 EF 和 NHibernate ORM,如果我们最终改变我们的计划,我们不想更新我们的 POCO

【问题讨论】:

    标签: nhibernate data-modeling poco entity-framework-4.1


    【解决方案1】:

    EF 需要用于延迟加载的虚拟导航属性,但它也使用virtual 标量/复杂属性进行动态更改跟踪,因此如果您将所有属性标记为virtual,这将是正确的方法。

    无论如何,您会提前评估。如果您决定稍后更改 ORM,virtual 属性将是最小的问题 - 您会发现更难的问题。

    【讨论】:

      【解决方案2】:

      实际上,您不必在 NH 中将每个属性都声明为虚拟属性。如果您关闭延迟加载行为(默认为“on”),您不再需要声明所有这些“虚拟”,并且可以逐个指定哪些属性是延迟加载的。

      因此,如果您愿意,您可以在 NH 和 EF 中拥有一个仅包含虚拟引用对象的 POCO。

      旁注:无论如何,为了努力,我会将所有属性声明为虚拟并完成它:)

      【讨论】:

      • (1) NH 延迟加载是否只需要虚拟属性?我认为它创建了一个基于继承的代理(除非提供了接口),因此需要虚拟道具和方法。 (2) 如果您关闭延迟加载,您将失去 ORM 为您提供的许多好处。
      • 我同意你的旁注:让它们虚拟化。
      • 如果您将该类标记为不延迟加载,则它不应再创建代理。像 ,因此不需要虚拟
      • 无论如何,我只是在迂腐。我不推荐这个,当你说你会失去 NHibernate 的许多好处时,我同意你的观点:)
      【解决方案3】:

      或者,如果您为 POCO 创建一个接口或抽象基,您可以在 NHibernate 中使用 <class name="MyPoco" proxy="IMyPoco"/> 属性,这也消除了对虚拟属性的需要,因为 NH 然后推迟从代理创建其子类,而不是直接从您的 POCO 获取。

      【讨论】:

      • 非常有趣。我所有的 POCO 都派生自一个抽象类——我不知道这是可能的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-05
      • 2012-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-27
      • 2016-11-08
      相关资源
      最近更新 更多