我有一个实体,如:

public class Employee
{
    public int ID { get; set; }
    public IAccountManager AccountManager { get; set; }
    ...
}

我还为“DefaultAccountManager”定义了一个映射——IAccountManager 的具体实现。当映射上面的“Employee”实体时,我如何告诉 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 对所有 IAccountManagers 都是唯一的,而不是每个表唯一的(通过利用 hilo)。

    当 NHibernate 看到 IAccountManager 实体时,它将使用实例的具体类型和联合子类定义来找出正确的表。

    希望这可以帮助!

    关于c# - 流利的 nhibernate : How do I map an entity with a property who's type is an interface?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/849664/

    10-12 20:37