Sql server Fluent NHibernate多对多使用非PK列

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

我需要在其中两个表中使用非PK列来关联一些表。表格和FK的设置如下所示:

因此,可以通过MessageUserGroups表将消息分配给许多用户和组。此外,可以通过UserGroups表将用户分配到多个组

由于遗留原因,用户和组中的AdGuid字段(唯一标识符)不是主键。但是,我想使用MessageUserGroups中的UserId和GroupId字段通过其AdGuid字段将消息与用户和组关联起来

此外,我希望在用户上有一个将Message.AuthorId与User.AdGuid关联的PostedMessages属性,并在用户和组上有一个通过MessageUserGroups与消息关联的Messages属性

我该如何向你解释

目前,映射如下所示:

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