NHibernate发布关于单向一对多的附加更新

NHibernate发布关于单向一对多的附加更新,nhibernate,nhibernate-mapping,Nhibernate,Nhibernate Mapping,我正在使用NHibernate中的新地图。我的理解是,NHibernate 3中进行了更新,这样单向一对多关系将不再在外键上插入null,然后将其更新为正确的值,只要在集合上设置inverse=false并使外键不可为null 我看到的是NHibernate现在插入了正确的外键,但它仍然会发出一个额外的更新,将外键设置为插入中使用的值 我是否在映射中做了错误的事情?(一个用户可以有多个密码。密码对象不会引用回我的域中的用户。) mapper.Class(map=> { 映射表(“密码”); ma

我正在使用NHibernate中的新地图。我的理解是,NHibernate 3中进行了更新,这样单向一对多关系将不再在外键上插入null,然后将其更新为正确的值,只要在集合上设置inverse=false并使外键不可为null

我看到的是NHibernate现在插入了正确的外键,但它仍然会发出一个额外的更新,将外键设置为插入中使用的值

我是否在映射中做了错误的事情?(一个用户可以有多个密码。密码对象不会引用回我的域中的用户。)

mapper.Class(map=>
{
映射表(“密码”);
map.Id(x=>x.Id,x=>{x.Generator(Generators.Native);x.Column(“PasswordId”);});
属性(x=>x.PasswordFormat,x=>{x.NotNullable(true);});
属性(x=>x.Salt,x=>{x.Length(100);});
属性(x=>x.PasswordValue,x=>{x.NotNullable(true);x.Length(500);});
属性(x=>x.CreateDate,x=>{x.NotNullable(true);});
});
类(map=>
{
地图表格(“用户”);
map.Id(x=>x.Id,x=>{x.Generator(Generators.Native);x.Column(“UserId”);});
属性(x=>x.UserName,x=>{x.NotNullable(true);x.Length(100);x.UniqueKey(“UX_用户_用户名”);});
属性(x=>x.Email,x=>{x.Length(100);x.Index(“IX_Users_Email”);});
属性(x=>x.IsAnonymous,x=>{x.NotNullable(true);});
属性(x=>x.IsApproved,x=>{x.NotNullable(true);});
属性(x=>x.LastActivityDate,x=>{x.NotNullable(true);});
属性(x=>x.CreateDate,x=>{x.NotNullable(true);});
map.Set(x=>x.Passwords,x=>{x.Access(Accessor.Field);x.Inverse(false);x.Key(k=>{k.Column(“UserId”);k.notnull(true);k.ForeignKey(“FK_Passwords_UserId”);});x.Cascade(Cascade.All);x.Lazy(CollectionLazy.Lazy);},x=>x.OneToMany();
});
注意:这是使用内置的NHibernate.Mapping.ByCode,而不是Fluent NHibernate。

它应该是Inverse()而不是Inverse(false)

Inverse()表示其他实体拥有该关系,并负责在插入/更新信息时向NHibernate提供有关该关系的数据,即,如果“user”设置为on Inverse,“password”需要负责提供关系信息。对我来说

为此,您需要在“密码”实体上设置“用户”引用属性。在创建/更新密码时,显式分配用户属性

//create new password
Password objPassword = new Password();
objPassword.otherproperties =///assign
objPassword.User = <<---assign the user property
//创建新密码
Password objPassword=新密码();
objPassword.otherproperties=///assign

objPassword.User=结果表明,我可以通过在密码集合映射的外键部分设置
k.Update(false)
来实现这一点

hazzik对以下问题的回答让我排队等候


Sundeep,反向需要布尔参数。您是否认为Fluent NHibernate与内置的NHibernate.Mapping.ByCode相反?在任何情况下,它都应该为false,因为父级正在管理关系(密码中没有对用户的引用,因此它无法管理关系)。很抱歉。我错了,我是否应该删除回复,因为它与回复无关。我确实发现了它的不同语法,但我认为“逆”的含义是相同的。Sundeep,如前所述,这是一种单向关系,没有对用户的引用。密码永远不会改变所有权,所以我看不出有什么理由维护对用户的引用,除非它是NHibernate知道如何处理关系的一个限制。虽然你的评论似乎无关紧要,但似乎几乎总是对反向属性感到困惑。我认为其他几个人可能也有同样的困惑,所以我个人不会要求你删除它。你是否与NH3中修复的问题有联系?我一直在为这个问题做双向的一对多…这里有一个链接到我所引用的内容。请参阅编辑,以及Hazzik对该问题的评论。嗯,我记得那个问题,当时我对VikciaR的评论投了赞成票……哈哈,我没法让它生效是的,我也投了赞成票:)我还没有找到关于NhForge或其他任何地方的任何其他信息,但我注意到建议的更改确实导致了正确的插入。我想如果它要进行更新,我至少希望它通过避免空插入来保持引用完整性。我当然希望能够避免在关系的密码端添加属性,但我可能只是为了避免更新。(你有多少次将加密密码重新分配给另一个用户?)从来没有,哈哈……在这些情况下,我通常会给父(用户)一个受保护的setter,并添加一个额外的ctor,将父作为参数。很明显,这是不能改变的……只有我的2美分。
//create new password
Password objPassword = new Password();
objPassword.otherproperties =///assign
objPassword.User = <<---assign the user property