我有一个实体,如:
public class Employee
{
public int ID { get; set; }
public IAccountManager AccountManager { get; set; }
...
}
我还为“DefaultAccountManager”定义了一个映射——IAccountManager 的具体实现。当映射上面的“Employee”实体时,我如何告诉 NHibernate 使用“DefaultAccountManager”中定义的映射来持久化/加载 AccountManager 属性?
编辑:
实际上,如果我可以为 IAccountManager 设置一个映射,这样 NHibernate 就可以推断出要加载/保持哪个实现者会更好。我宁愿不必通过强制所有实现者使用相同的映射来破坏多态性。
最佳答案
我确实找到了这个问题的答案。我对细节有点模糊,就像几个月前一样,但以下是解决方案的要点:
联合子类看起来像这样:
<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/