CodeGo.net>流利的NHibernate的:我如何映射一个实体的类型是接口的属性?
作者:互联网
我有一个像这样的实体:
public class Employee
{
public int ID { get; set; }
public IAccountManager AccountManager { get; set; }
...
}
我还为“ DefaultAccountManager”定义了一个映射-IAccountManager的具体实现.在映射上述“雇员”实体时,如何告诉NHibernate使用“ DefaultAccountManager”中定义的映射来持久化/加载AccountManager属性?
编辑:
实际上,如果我可以为IAccountManager设置映射,以便NHibernate可以推断要加载/持久化的实现者,那会更好.我宁愿通过强制所有实现者使用相同的映射来打破多态性.
解决方法:
我确实找到了这个答案.我对细节有些模糊,就像几个月前一样,但是以下是解决方案的精髓:
>为具有映射的IAccountManager的每个实现创建一个表.
>确保您的数据库已设置为使用HiLo id算法.
>在映射中使用并集子类
联合子类如下所示:
<class name="IAccountManager" abstract="true">
<id name="ID" column="ID" type="Int32">
<generator class="hilo"/>
</id>
<union-subclass name="DefaultAccountManager" table="DefaultAccountManager"
proxy="IAccountManager">
<property name="FirstName" type="String"/>
<property name="LastName" type="String"/>
</union-subclass>
... more implementations
</class>
注意联合子类上的属性“名称”.对于IAccountManager的每个实施,此名称应该是唯一的(并与之匹配).
此外,ID(不是每个表都唯一)对于所有IAccountManager都是唯一的(通过使用hilo).
当NHibernate看到一个IAccountManager实体时,它将使用实例的具体类型和并集-子类定义来找出正确的表.
希望这可以帮助!
标签:interface,nhibernate,nhibernate-mapping,c,fluent-nhibernate 来源: https://codeday.me/bug/20191024/1921108.html