gpt4 book ai didi

c# - 流利的休眠状态 : How do I map an entity with a property who's type is an interface?

转载 作者:行者123 更新时间:2023-11-30 15:12:44 25 4
gpt4 key购买 nike

我有一个像这样的实体:

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# - 流利的休眠状态 : How do I map an entity with a property who's type is an interface?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/849664/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com