我在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])
有任何想法吗?这是一个非常简单的场景之一,但我们找不到合适的配置......