我有一个非常简单的单向映射。见下文:
public ContactMap()
{
Id(x => x.Id).GeneratedBy.Assigned();
Map(x => x.Name);
References(x => x.Device);
HasMany(x => x.Numbers)
.Not.Inverse()
.Not.KeyNullable()
.Cascade.AllDeleteOrphan()
.Not.LazyLoad()
.Fetch.Subselect();
Table("Contacts");
}
public PhoneNumberMap()
{
Id(x => x.Id).GeneratedBy.Native();
Map(x => x.Number);
Table("ContactNumbers");
}
根据nhibernate 3及更高版本之后的这篇文章,将键设置为不可为空应该可以解决插入更新问题(当NHibernate发出插入外键设置为null然后更新以将外键更新为正确值时的问题) ,但对我来说不是这样。当我将键设置为不可为空时,NHibernate 会发出正确的插入语句
INSERT INTO ContactNumbers
(Number,
ContactId)
VALUES ('(212) 121-212' /* @p0 */,
10 /* @p1 */);
如您所见,它插入了 ContactId 字段,但之后仍然发出更新语句
UPDATE ContactNumbers
SET ContactId = 10 /* @p0 */
WHERE Id = 34 /* @p1 */
所以要澄清问题。NHibernate 插入具有正确分配外键的联系人行,然后发出更新语句来更新冗余的外键(ContactId)。
我怎样才能摆脱这个多余的更新语句?谢谢。
顺便说一句,我正在使用最新版本的 NHibernate 和 Fluent NHibernate。数据库是 SQLite