我有一个像这样的实体:
public class Employee
{
public int ID { get; set; }
public IAccountManager AccountManager { get; set; }
...
}
我还为“DefaultAccountManager”定义了一个映射 - IAccountManager 的具体实现。当映射上面的“Employee”实体时,我如何告诉 NHibernate 使用“DefaultAccountManager”中定义的映射来持久/加载 AccountManager 属性?
Edit:实际上,如果我可以为 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 实体时,它将使用实例的具体类型和联合子类定义来找出正确的表。
希望这可以帮助!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)