C# Fluent NHibernate现有数据库上的多对多关系

C# Fluent NHibernate现有数据库上的多对多关系,c#,nhibernate,fluent-nhibernate,fluent,fluent-nhibernate-mapping,C#,Nhibernate,Fluent Nhibernate,Fluent,Fluent Nhibernate Mapping,我正在使用Fluent NHibernate映射现有数据库,在尝试填充多对多集合时遇到了一个问题。数据库本身没有使用外键正确设置,下面是我遇到的问题的一个简化示例 表: 使用者 团体 用户组 实体类: 公共类用户 { 公共虚拟长用户ID{get;set;} 公共虚拟字符串名称{get;set;} 公共虚拟IList组{get;set;} } 公共课组 { 公共虚拟长组ID{get;set;} 公共虚拟字符串名称{get;set;} 公共虚拟IList用户{get;set;} } 公共类用户组

我正在使用Fluent NHibernate映射现有数据库,在尝试填充多对多集合时遇到了一个问题。数据库本身没有使用外键正确设置,下面是我遇到的问题的一个简化示例

表:

  • 使用者
  • 团体
  • 用户组

  • 实体类:
    公共类用户
    {
    公共虚拟长用户ID{get;set;}
    公共虚拟字符串名称{get;set;}
    公共虚拟IList组{get;set;}
    }
    公共课组
    {
    公共虚拟长组ID{get;set;}
    公共虚拟字符串名称{get;set;}
    公共虚拟IList用户{get;set;}
    }
    公共类用户组
    {
    公共虚拟用户用户{get;set;}
    公共虚拟组{get;set;}
    #区域组合密钥覆盖
    公共覆盖布尔等于(对象对象对象)
    {
    if(obj==null)
    返回false;
    var compare=obj作为UserInGroup;
    if(比较==null)
    返回false;
    返回User.UserID==compare.User.UserID&&
    Group.GroupID==compare.Group.GroupID;
    }
    公共覆盖int GetHashCode()
    {
    返回(User.UserID+“|”+Group.GroupID).GetHashCode();
    }
    #端区
    }
    

    映射类:
    公共类用户映射:类映射
    {
    公共用户映射()
    {
    表(“用户”);
    Id(x=>x.UserID,“UserID”).GeneratedBy.Identity();
    映射(x=>x.Name,“Name”);
    HasManyToMany(x=>x.Groups).Table(“UsersInGroups”)
    .ParentKeyColumn(“GroupID”)
    .ChildKeyColumn(“用户ID”)
    .Cascade.All();
    }
    }
    公共类组映射:类映射
    {
    公共组映射()
    {
    表(“组”);
    Id(x=>x.GroupID,“GroupID”).GeneratedBy.Identity();
    映射(x=>x.Name,“Name”);
    HasManyToMany(x=>x.Users).Table(“UsersInGroups”)
    .ParentKeyColumn(“用户ID”)
    .ChildKeyColumn(“组ID”)
    .Inverse();
    }
    }
    公共类UserInGroupMap:ClassMap
    {
    公共UserInGroupMap()
    {
    表(“用户组”);
    CompositeId().KeyReference(x=>x.User,“UserID”)
    .KeyReference(x=>x.Group,“GroupID”);
    }
    }
    


    在我的配置中,我启用了渴望加载,HasMany关系似乎工作正常,但HasManyToMany关系返回一个空集合。我在集合上尝试了Cascade.All()和reverse的几种不同组合,但都没有成功。非常感谢您提供的任何帮助。

    请尝试在两个映射中反转
    ParentKeyColumn
    ChildKeyColumn
    。@AlessandroD'Andria这就是问题的原因。真不敢相信我竟然忽略了它。我认为
    ParentKeyColumn
    将映射到实体列表,而不是子实体。非常感谢您Hafaik级联用于保存/更新。。不是读书。很高兴你把它整理好了。请解释一下为什么你的答案会回答这个问题欢迎使用堆栈溢出!虽然这个代码片段可以解决这个问题,但它确实有助于提高文章的质量。请记住,您将在将来回答读者的问题,这些人可能不知道您的代码建议的原因。还请尽量不要用解释性注释挤满您的代码,因为这会降低代码和解释的可读性!
    HasManyToMany(x => x.Users).Table("UsersInGroups")
                               .ParentKeyColumn("UserID")
                               .ChildKeyColumn("GroupID")
                               .Not.LazyLoad();
    
    public class UserMap : ClassMap<User>
    {
        public UserMap()
        {
            Table("Users");
            Id(x => x.UserID, "UserID").GeneratedBy.Identity();
    
            Map(x => x.Name, "Name");
    
            HasManyToMany(x => x.Groups).Table("UsersInGroups")
                                        .ParentKeyColumn("GroupID")
                                        .ChildKeyColumn("UserID")
                                        .Cascade.All();
        }
    }
    
    public class GroupMap : ClassMap<Group>
    {
        public GroupMap()
        {
            Table("Groups");
            Id(x => x.GroupID, "GroupID").GeneratedBy.Identity();
    
            Map(x => x.Name, "Name");
    
            HasManyToMany(x => x.Users).Table("UsersInGroups")
                                       .ParentKeyColumn("UserID")
                                       .ChildKeyColumn("GroupID")
                                       .Inverse();
        }
    }
    
    public class UserInGroupMap : ClassMap<UserInGroup>
    {
        public UserInGroupMap()
        {
            Table("UsersInGroups");
    
            CompositeId().KeyReference(x => x.User, "UserID")
                         .KeyReference(x => x.Group, "GroupID");
        }
    }
    
    HasManyToMany(x => x.Users).Table("UsersInGroups")
                               .ParentKeyColumn("UserID")
                               .ChildKeyColumn("GroupID")
                               .Not.LazyLoad();
    
        HasManyToMany(x => x.Users).Table("UsersInGroups") 
          .ParentKeyColumn("GroupID")
          .ChildKeyColumn("UserID")
          .Not.LazyLoad();