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