我知道NHibernate的POCO类的所有成员都必须定义为虚拟,而在EF(代码优先)中,您只需要将集合/引用对象设置为虚拟以进行延迟加载。
因此,如果我想创建与EF和NH兼容的POCO对象,我应该将我的POCO类的每个成员声明为虚拟吗?
想要这个的原因是我们目前正在评估EF和NHibernate ORM,如果我们最终改变我们的计划,我们不想更新我们的POCO
答案 0 :(得分:3)
EF需要延迟加载的虚拟导航属性,但它还使用virtual
标量/复杂属性进行动态更改跟踪,因此如果您将所有属性标记为virtual
,那么这将是正确的方法。
无论如何,你是否提前评估。如果您决定稍后更改ORM,virtual
属性将是最小的问题 - 您会发现更难的问题。
答案 1 :(得分:1)
实际上,您并没有被迫在NH中将每个属性声明为虚拟。如果关闭延迟加载行为(默认情况下为'on'),则不再需要声明所有这些“虚拟”,并且可以指定哪些属性是延迟加载的。
所以,如果你愿意,你可能有一个POCO只有NH和EF中的虚拟引用对象。
旁注:无论如何,只是为了努力,我会将所有属性声明为虚拟并完成它:)
答案 2 :(得分:1)
或者,如果你为POCO创建一个接口或抽象基础,你可以使用NHibernate中的<class name="MyPoco" proxy="IMyPoco"/>
属性,这也消除了对虚拟属性的需要,因为NH然后推迟从代理创建它的子类而不是直接从你的POCO。