我在SQL Server数据库中有这些表 . MemberCv 是一个遗留表,我们可以't modify, so we'使用NHibernate join 映射来映射新功能所需的额外列:

MemberCv (
    MemberId varchar -- part of composite key,
    PublicationCode int -- part of composite key,
    PictureFileName varchar -- UNIQUE KEY constraint UK_PictureFileName
)

PhotoSTatus (
    FileName varchar -- primary key,
    IsHidden bit,
    Sequence int
)

所以生成的C#类看起来像:

public class MemberCv {
    public Member Member { get; set; }
    public Publication Publication { get; set; }
    public string FileName { get; set; }
    public int IsHidden { get; set; }
    public int Sequence { get; set; }
}

问题是,NHibernate(使用Fluent NH)尝试使用在MemberCv表上定义的主(复合)键映射它 . 是的,我知道NHibernate讨厌主键 . 不,我不能引入人工密钥并将现有密钥转换为唯一约束 .

MemberCv 覆盖图中,我们尝试过:

map.Join("PhotoStatus", join
  .KeyColumn("FileName")
  .References(cv => cv.PictureFileName)
  .UniqueKey("UK_PictureRef");

这导致:

NHibernate.FKUnmatchingColumnsException:外键(FK3F10D2B7EA4868D8:MyDatabase.dbo.PhotoStatus [FileName]))必须与引用的主键具有相同的列数(MemberCv [Member,Publication])

我们甚至尝试在PhotoStatus表中使用计算列(Filename基于MemberId和PublicationCode,因此可以计算关联复合键的元素),然后使用隐式连接,这会导致:

NHibernate.FKUnmatchingColumnsException:外键(FK3F10D2B7F670FD07:MyDatabase.dbo.PhotoStatus [MemberCv_id]))必须与引用的主键具有相同的列数(MemberCv [Member,Publication])

有任何想法吗?这是一个非常简单的场景之一,但我们找不到合适的配置......