我有Post和Comment课程,他们有一对多关系,其中Post有一个评论列表.我如何将其映射为与Fluent NHibernate的单向关系,因为评论不需要知道其父Post?目前,这是我对Comment的映射:
Id(x => x.Id);
Map(x => x.Body);
References(x => x.User);
Run Code Online (Sandbox Code Playgroud)
和邮政:
Id(x => x.Id);
Map(x => x.Title);
HasMany(x => x.Comments)
.Inverse()
.WithKeyColumn("PostId")
.Cascade.AllDeleteOrphan();
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为当我尝试使用新添加的Comment保存Post实例时,Comment(PostId)上的外键保持为NULL.当然,使用NULL PostId无法保存注释.我已经尝试删除.Inverse()子句,但这也不起作用.
我有一个非常简单的单向映射.见下文:
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");
}
Run Code Online (Sandbox Code Playgroud)
根据nhibernate 3及更高版本之后的这篇文章,将key设置为non-nullable应该修复insert-update问题(当NHibernate发出插入时外键设置为null然后更新以更新外键以纠正值时的问题) ,但事实并非如此.当我将密钥设置为不可为空时,NHibernate会发出正确的插入语句
INSERT INTO ContactNumbers
(Number,
ContactId)
VALUES ('(212) 121-212' /* @p0 */,
10 /* @p1 */);
Run Code Online (Sandbox Code Playgroud)
如您所见,它会插入ContactId字段,但在此之后,它仍会发出update语句
UPDATE ContactNumbers
SET ContactId = 10 /* @p0 */
WHERE Id = 34 /* @p1 */
Run Code Online (Sandbox Code Playgroud)
所以要澄清问题.NHibernate使用正确分配的外键插入Contact行,然后发出更新语句以更新冗余的外键(ContactId).
如何摆脱这种冗余的更新声明?谢谢.
顺便说一下,我正在使用最新版本的NHibernate和Fluent NHibernate.数据库是SQLite