我如何使用Fluent NHibernate来区分父母关系的列
本文关键字:父母 关系 何使用 Fluent NHibernate | 更新日期: 2023-09-27 18:26:28
我有这个实体关系。
public abstract class UserGroup
{
public virtual int UserGroupId { get; set; }
public virtual int GroupType { get; set; }
public virtual string GroupName { get; set; }
public virtual IList<UserGroupMember> GroupMembers { get; set; }
}
public class UserGroupMember
{
public virtual int UserGroupMemberId { get; set; }
public virtual User User { get; set; }
public virtual UserGroup UserGroup { get; set; }
}
注意,UserGroup
是基类,并且我有一些派生类由UserGroup.GroupType
区分。我正在使用每个类层次结构的单个表继承映射策略。
Fluent NHibernate映射:
public class UserGroupMap : BaseClassMap<UserGroup>
{
public UserGroupMap()
{
Table("UserGroup");
Id(x => x.UserGroupId);
DiscriminateSubClassesOnColumn("GroupType");
Map(x => x.GroupName);
HasMany(x => x.GroupMembers)
.KeyColumn("UserGroupId")
.Cascade.AllDeleteOrphan()
.Inverse();
}
}
public class UserGroupMemberMap: BaseClassMap<UserGroupMember>
{
public UserGroupMemberMap()
{
Table("UserGroupMember");
Id(x => x.UserGroupMemberId);
References(x => x.User, "UserId")
.Cascade.SaveUpdate();
References(x => x.UserGroup, "UserGroupId")
.Cascade.SaveUpdate();
}
}
这就是我想要实现的目标:
我想让UserGroupMember也成为一个基类,并让它在UserGroup.GroupType
鉴别器上进行判别。这可能吗?
这个问题的另一种表述方式是,如果我能添加以下行,那就太棒了:
DiscriminateSubClassesOnColumn("UserGroup.GroupType");
进入UserGroupMemberMap
I。我们不能使用DiscriminateSubClassesOnColumn("UserGroup.GroupType");
在许多其他好的理由中,discriminator
由NHiberante管理。这意味着,在任何子对象创建过程中,这样的值都必须容易插入。并且不适用于包含的外部表/引用。。。
II。但在这些情况下,我们可以走另一条路。让我们观察文档(在xml
映射中,但fluent只是它上面的包装器)
5.1.6.鉴别器
<discriminator
column="discriminator_column" (1)
type="discriminator_type" (2)
force="true|false" (3)
insert="true|false" (4)
formula="arbitrary SQL expression" (5)
/>
(1) column(可选-默认为类)鉴别器列的名称
(2) type(可选-默认为String)表示NHibernate类型的名称
(3) force(可选-默认为false)"force"NHibernate指定允许的鉴别器值,即使在检索根类的所有实例时也是如此
(4) insert(可选-默认为true)如果鉴别器列也是映射的复合标识符的一部分,则将其设置为false
(5) 公式(可选)当必须计算类型时执行的任意SQL表达式。允许基于内容的区分。
CCD_ 8和CCD_。我们可以简单地将鉴别器设置为只读(无插入),并使用公式。
<discriminator insert="false"
formula="(SELECT ug.GroupType FROM UserGroup ug WHERE ug.UserGroupId = UserGroupId)"/>
注意:最后一个UserGroupId
将由NHibernate处理为当前表中的一列。这是必不可少的,令人敬畏
很好。现在我们的<discriminator>
确实返回了正确的值。它也不会在创建新实例的过程中插入值。我们只需要确保,会分配适当的UserGroup
参考,具有所需的类型。。。
流利应该是显而易见的,但可以肯定的是:
DiscriminateSubClassesOnColumn(null)
.Formula("(SELECT...")
.ReadOnly()
;