代码之家  ›  专栏  ›  技术社区  ›  Cole W

Fluent-NHibernate对象化/关联关系映射

  •  0
  • Cole W  · 技术社区  · 15 年前

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

    ER Diagram

    下面是我当前的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");
        }
    }
    

    目前,每当我创建一个新的GroupHeader并填充AllowedRights成员变量时,它都无法插入这些记录,因为GROUP-RIGHT-COMPOSITE中的RIGHT-VALUE列不允许为空。我真的不知道如何用流利的语言来映射,也不知道在我的实体中应该如何处理。任何帮助都将不胜感激。

    1 回复  |  直到 9 年前
        1
  •  0
  •   Community Mohan Dere    8 年前

    我在上面的映射中发现的问题是,我试图将用户组组合表视为一个关系,而不是实体本身。我已经修改了上面的代码,这样一个新的实体叫做GysPrIt,并且在实体内部引用了GroupHeader和LeTeHead。

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

    Link 1 Link 2

    推荐文章