我如何使用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

我如何使用Fluent NHibernate来区分父母关系的列

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()
    ;