Sql server Fluent NHibernate多对多使用非PK列
我需要在其中两个表中使用非PK列来关联一些表。表格和FK的设置如下所示: 因此,可以通过MessageUserGroups表将消息分配给许多用户和组。此外,可以通过UserGroups表将用户分配到多个组 由于遗留原因,用户和组中的AdGuid字段(唯一标识符)不是主键。但是,我想使用MessageUserGroups中的UserId和GroupId字段通过其AdGuid字段将消息与用户和组关联起来 此外,我希望在用户上有一个将Message.AuthorId与User.AdGuid关联的PostedMessages属性,并在用户和组上有一个通过MessageUserGroups与消息关联的Messages属性 我该如何向你解释 目前,映射如下所示:Sql server Fluent NHibernate多对多使用非PK列,sql-server,nhibernate,fluent-nhibernate,Sql Server,Nhibernate,Fluent Nhibernate,我需要在其中两个表中使用非PK列来关联一些表。表格和FK的设置如下所示: 因此,可以通过MessageUserGroups表将消息分配给许多用户和组。此外,可以通过UserGroups表将用户分配到多个组 由于遗留原因,用户和组中的AdGuid字段(唯一标识符)不是主键。但是,我想使用MessageUserGroups中的UserId和GroupId字段通过其AdGuid字段将消息与用户和组关联起来 此外,我希望在用户上有一个将Message.AuthorId与User.AdGuid关联的Po
public MessageMap()
{
Id(m => m.Id);
References(m => m.Author).Nullable().ForeignKey("FK_Messages_Author").Column("AuthorId").Fetch.Join().PropertyRef(u => u.AdGuid);
HasManyToMany<users.user>(m => m.Users)
.Cascade.All()
.ParentKeyColumn("MessageId")
.ChildKeyColumn("UserId")
.Table("MessageUserGroups")
.FetchType.Join();
HasManyToMany<users.group>(m => m.Groups)
.Cascade.All()
.ParentKeyColumn("MessageId")
.ChildKeyColumn("GroupId")
.Table("MessageUserGroups")
.FetchType.Join();
}
public UserMap()
{
Id(u => u.Id);
Map(u => u.AdGuid);
HasManyToMany<staff.Message>(u => u.Messages)
.Cascade.All()
.ParentKeyColumn("AdGuid")
.ChildKeyColumn("UserId")
.Inverse()
.LazyLoad()
.Table("MessageUserGroup")
HasMany<staff.Message>(u => u.PostedMessages)
.Cascade.All()
.KeyColumn("AuthorId")
.Inverse()
.LazyLoad()
.Table("Messages")
HasManyToMany<Group>(u => u.Groups)
.Cascade.All()
.Not.LazyLoad()
.Cascade.All()
.ParentKeyColumn("UserID")
.ChildKeyColumn("GroupID")
.Table("UserGroups")
}
public GroupMap()
{
Id(g => g.Id);
Map(g => g.AdGuid);
HasManyToMany<staff.Message>(g => g.Messages)
.Cascade.All()
.ParentKeyColumn("AdGuid")
.ChildKeyColumn("GroupId")
.Inverse()
.LazyLoad()
.Table("MessageUserGroup")
HasManyToMany<User>(g => g.Users)
.Inverse()
.Cascade.All()
.ParentKeyColumn("GroupId")
.ChildKeyColumn("UserId")
.Table("UserGroups")
}
该联接无效,因为它正在尝试将uniqueidentifer MessageUserGroups.UserId与bigint User.Id进行比较
同样,当延迟加载User.PostedMessages时,将生成以下SQL(同样,缩写):
并且@p0
设置为89,这是我正在测试的用户的Id,但是AuthorId需要是唯一标识符
在这两个之后,我得到一个SqlException
:操作数类型冲突:uniqueidentifier与预期的bigint
不兼容
看起来(Fluent)NHibernate总是想加入PKs,尽管文档建议指定ParentKeyColumn和ChildKeyColumn应该允许我指定我喜欢的任何列。这真的有可能吗?是否误读?ParentKeyColumn和ChildKeyColumn指定链接表中连接的实体表的列之间的列名,而不是列之间的列名。您需要的是hasmanytomany上的
PropertyRef
和ChildPropertyRef
来指定要加入的属性设置ParentKeyColumn和ChildKeyColumn,并且仅在关系的消息端定义映射才起作用。谢谢
SELECT users0_.MessageId as MessageId1_, users0_.UserId as UserId1_, user1_.Id
as id38_0_, user1_.AdGuid as guid38_0_ FROM MessageUserGroups users0_
LEFT OUTER JOIN Users user1_ on users0_.UserId=user1_.Id WHERE users0_.MessageId=@p0
SELECT postedmess0_.AuthorId as AuthorId1_, postedmess0_.Id as Id1_, postedmess0_.Id as Id43_0_, postedmess0_.AuthorId as AuthorId43_0_
FROM Staff.Messages postedmess0_
WHERE postedmess0_.AuthorId=@p0