如何在使用唯一键而不是主键的NHibernate / Fluent NHibernate中映射表连接?

时间:2011-06-02 11:00:37

标签: nhibernate fluent-nhibernate nhibernate-mapping

我在SQL Server数据库中有这些表。 MemberCv是我们无法修改的遗留表,因此我们使用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])

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

0 个答案:

没有答案