【问题标题】:Fluent NHibernate many-to-many relationship on existing databaseFluent NHibernate 现有数据库上的多对多关系
【发布时间】:2013-09-16 17:13:33
【问题描述】:

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

表格:

  1. 用户
  2. 组
  3. UsersInGroups

实体类:

public class User
{
    public virtual long UserID { get; set; }
    public virtual string Name { get; set; }

    public virtual IList<Group> Groups { get; set; }
}

public class Group
{
    public virtual long GroupID { get; set; }
    public virtual string Name { get; set; }

    public virtual IList<User> Users { get; set; }
}

public class UserInGroup
{
    public virtual User User { get; set; }
    public virtual Group Group { get; set; }

    #region Fluent NHibernate Composite Key Overrides

    public override bool Equals(object obj)
    {
        if (obj == null)
            return false;

        var compare = obj as UserInGroup;

        if (compare == null)
            return false;

        return User.UserID == compare.User.UserID &&
               Group.GroupID == compare.Group.GroupID;
    }

    public override int GetHashCode()
    {
        return (User.UserID + "|" + Group.GroupID).GetHashCode();
    }

    #endregion
}

映射类:

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");
    }
}

在我的配置中,我启用了预加载,HasMany 关系似乎工作正常,但 HasManyToMany 关系返回一个空集合。我在集合上尝试了 Cascade.All() 和 Inverse 的几种不同组合,但均未成功。任何帮助将不胜感激,谢谢。

【问题讨论】:

  • 尝试在两个映射中反转ParentKeyColumn 和ChildKeyColumn。
  • @AlessandroD'Andria 这就是导致问题的原因。我不敢相信我忽略了它。我认为ParentKeyColumn 会映射到实体列表而不是子对象。非常感谢
  • Afaik 级联用于保存/更新.. 不是读取。很高兴你把它整理好了。

标签: c# nhibernate fluent-nhibernate fluent fluent-nhibernate-mapping


【解决方案1】:
HasManyToMany(x => x.Users).Table("UsersInGroups")
                           .ParentKeyColumn("UserID")
                           .ChildKeyColumn("GroupID")
                           .Not.LazyLoad();

【讨论】:

    【解决方案2】:
        HasManyToMany(x => x.Users).Table("UsersInGroups") 
          .ParentKeyColumn("GroupID")
          .ChildKeyColumn("UserID")
          .Not.LazyLoad();
    

    【讨论】:

    • 请提供更多解释,说明您的答案为何能回答问题
    • 欢迎来到 Stack Overflow!虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您正在为将来的读者回答问题,而这些人可能不知道您的代码建议的原因。也请尽量不要用解释性 cmets 挤满你的代码,因为这会降低代码和解释的可读性!
    猜你喜欢
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多