C# Fluent NHibernate对象化/关联关系映射

C# Fluent NHibernate对象化/关联关系映射,c#,fluent-nhibernate,C#,Fluent Nhibernate,好的,我对Fluent和NHibernate很陌生,我不知道如何映射数据库中存在的这种特定关系。下面的ER图概述了我的表结构 下面是我当前的C#实体类和Fluent映射: public class GroupHeader { public virtual Guid Id { get; private set;} public virtual string Name { get; set; } public virtual string Description { get

好的,我对Fluent和NHibernate很陌生,我不知道如何映射数据库中存在的这种特定关系。下面的ER图概述了我的表结构

下面是我当前的C#实体类和Fluent映射:

public class GroupHeader
{
    public virtual Guid Id { get; private set;}
    public virtual string Name { get; set; }
    public virtual string Description { get; set; }
    public virtual IList<RightHeader> AllowedRights { get; set; }
    public virtual IList<RightHeader> DeniedRights { get; set; }
    public virtual IList<RightHeader> UnsetRights { get; set; }
}

public class RightHeader
{
    public virtual decimal Num { get; private set; }
    public virtual string Name { get; set; }
    public virtual string Description { get; set; }
}

public class GroupHeaderMap : ClassMap<GroupHeader>
{
    public GroupHeaderMap()
    {
        Table("GROUP_HEADER");
        Id(x => x.Id, "GROUP_ID");
        Map(x => x.Name, "GROUP_NAME").Unique();
        Map(x => x.Description, "GROUP_DESCRIPTION");

        HasManyToMany(x => x.AllowedRights)
            .Table("GROUP_RIGHT_COMPOSITE")
            .ParentKeyColumn("GROUP_ID")
            .ChildKeyColumn("RIGHT_NUM")
            .Where("RIGHT_VALUE = 1")
            .Cascade.SaveUpdate();

        HasManyToMany(x => x.DeniedRights)
            .Table("GROUP_RIGHT_COMPOSITE")
            .ParentKeyColumn("GROUP_ID")
            .ChildKeyColumn("RIGHT_NUM")
            .Where("RIGHT_VALUE = -1")
            .Cascade.SaveUpdate();

        HasManyToMany(x => x.UnsetRights)
            .Table("GROUP_RIGHT_COMPOSITE")
            .ParentKeyColumn("GROUP_ID")
            .ChildKeyColumn("RIGHT_NUM")
            .Where("RIGHT_VALUE = 0")
            .Cascade.SaveUpdate();
    }
}

public class RightHeaderMap : ClassMap<RightHeader>
{
    public RightHeaderMap()
    {
        Table("RIGHT_HEADER");
        Id(x => x.Num, "RIGHT_NUM");
        Map(x => x.Name, "RIGHT_NAME");
        Map(x => x.Description, "RIGHT_DESCRIPTION");
    }
}
public类GroupHeader
{
公共虚拟Guid Id{get;private set;}
公共虚拟字符串名称{get;set;}
公共虚拟字符串描述{get;set;}
公共虚拟IList允许的权限{get;set;}
公共虚拟IList拒绝权限{get;set;}
公共虚拟IList权限{get;set;}
}
公共类右标题
{
公共虚拟十进制数{get;private set;}
公共虚拟字符串名称{get;set;}
公共虚拟字符串描述{get;set;}
}
公共类GroupHeaderMap:ClassMap
{
公共组头映射()
{
表(“组标题”);
Id(x=>x.Id,“组Id”);
Map(x=>x.Name,“GROUP_Name”).Unique();
地图(x=>x.描述,“组描述”);
HasManyToMany(x=>x.AllowedRights)
.表格(“组右组合”)
.ParentKeyColumn(“组ID”)
.ChildKeyColumn(“右键”)
.式中(“右值=1”)
.Cascade.SaveUpdate();
HasManyToMany(x=>x.DeniedRights)
.表格(“组右组合”)
.ParentKeyColumn(“组ID”)
.ChildKeyColumn(“右键”)
.式中(“右_值=-1”)
.Cascade.SaveUpdate();
HasManyToMany(x=>x.0)
.表格(“组右组合”)
.ParentKeyColumn(“组ID”)
.ChildKeyColumn(“右键”)
.式中(“右值=0”)
.Cascade.SaveUpdate();
}
}
公共类RightHeaderMap:ClassMap
{
公共右翼领袖
{
表格(“右标题”);
Id(x=>x.Num,“RIGHT_Num”);
Map(x=>x.Name,“RIGHT_Name”);
地图(x=>x.描述,“右描述”);
}
}

当前,每当我创建一个新的GroupHeader并填充AllowedRights成员变量时,它都无法插入这些记录,因为GROUP_RIGHT_COMPOSITE中的RIGHT_VALUE列不允许空值。我真的不知道如何在fluent中映射,或者在实体中应该在哪里处理这个问题。任何帮助都将不胜感激。

我发现上述映射存在的问题是,我试图将用户组组合表视为一种关系,而不是实体本身。我已经修改了上面的代码,这样一个名为GroupRight的新实体就存在了,并且在该实体中同时引用了GroupHeader和RightHeader

我认为这解决了我应该如何映射这些数据的总体问题,但我仍然存在将这些数据持久化到数据库的问题。我修改过的问题(包括对我的实体和映射的更新)可以在这里找到

我发现有助于解决此问题的文章有: