其他分享
首页 > 其他分享> > CodeGo.net>流利的NHibernate的:我如何映射一个实体的类型是接口的属性?

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