C# Fluent NHibernate现有数据库上的多对多关系
我正在使用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;} } 公共类用户组
实体类:
公共类用户
{
公共虚拟长用户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();