nHibernate正在尝试用SQL更新我刚刚创建的实体,而不是插入?
一个项目参与者可能是许多组的成员,一个组可能有许多项目参与者 我发现,当我创建2个ProjectParticipants(这很有效),然后用3个新组填充nHibernate正在尝试用SQL更新我刚刚创建的实体,而不是插入?,nhibernate,Nhibernate,一个项目参与者可能是许多组的成员,一个组可能有许多项目参与者 我发现,当我创建2个ProjectParticipants(这很有效),然后用3个新组填充项目组集合,并将参与者添加到相关组(A组有参与者1,B组有参与者2,C组有参与者1和2)时,我遇到了“StaleStateException-批量更新从更新返回意外的行计数;实际行数:0,预期为:3”。我希望nHibernate插入新组,但它正在运行更新查询,并拒绝承认它们不存在。它还没有将参与者分配到这些组 以下是映射: //ProjectMa
项目组集合,并将参与者添加到相关组(A组有参与者1,B组有参与者2,C组有参与者1和2)时,我遇到了“StaleStateException-批量更新从更新返回意外的行计数;实际行数:0,预期为:3”。我希望nHibernate插入新组,但它正在运行更新查询,并拒绝承认它们不存在。它还没有将参与者分配到这些组
以下是映射:
//ProjectMap: A Project..
Id(x => x.Id).GeneratedBy.GuidComb().UnsavedValue(Guid.Empty);
HasMany(x => x.Participants)
.Table("ProjectParticipants")
.KeyColumn("ProjectId")
.ApplyFilter(DeletedDateFilter.FilterName)
.Cascade.AllDeleteOrphan()
.Inverse();
HasMany(x => x.Groups)
.Table("ProjectGroups")
.KeyColumn("ProjectId")
.Cascade.AllDeleteOrphan()
.Inverse();
//ProjectParticipantMap: A ProjectParticipant…
Id(x => x.Id).GeneratedBy.GuidComb().UnsavedValue(Guid.Empty);
References(x => x.Project)
.Column("ProjectId")
.LazyLoad(Laziness.Proxy);
HasManyToMany(x => x.Groups)
.Table("ProjectGroupParticipants")
.ParentKeyColumn("ProjectParticipantId")
.ChildKeyColumn("ProjectGroupId");
//GroupMap: A Group...
Id(e => e.Id).GeneratedBy.Assigned().UnsavedValue(Guid.Empty);
References(e => e.Project)
.Column("ProjectId")
.LazyLoad(Laziness.Proxy);
HasManyToMany(x => x.Participants)
.Table("ProjectGroupParticipants")
.ParentKeyColumn("ProjectGroupId")
.ChildKeyColumn("ProjectParticipantId")
.ApplyChildFilter(DeletedDateFilter.FilterName);
各表如下:
[ProjectParticipants] 1-->M [ProjectGroupParticipants] M<--1 [ProjectGroups]
M M
\---------------->1 [Project] 1<--------------------/
那么为什么nHibernate认为它的本地实体已经保存,因此可以更新?生成的SQL应该是一个insert,但我不确定它如何管理本地缓存和数据库之间的同步,以知道实体是否已经存在
有点困惑,这在NH2.x中曾经起作用,但自从升级到最新版本(5.x)后,这个异常开始出现
有点困惑,这曾经在NH2.x中起作用
在5.2版本中,未保存值
的处理确实发生了变化。
如果我理解正确,此PR修复了某些情况,其中为指定的标识符忽略了提供的未保存值
映射
因此,对于具有指定标识符的实体,您似乎有不正确的未保存值
映射。从给定的数据来看,不清楚您希望NHibernate如何确定实体是否是瞬态的。使用映射,如果Id
不等于Guid,空的NHibernate将触发所有CAC的UPDATE
语句aded实体,这似乎是你看到的确切行为。
若要在实体不在会话中时检查数据库,请将其设置为“未定义”
:
Id(x => x.Id).GeneratedBy.GuidComb().UnsavedValue("undefined");
如果希望它始终保存实体,请将其设置为“any”
阅读并解释所有其他可能的值。同时检查此类似项
有点困惑,这曾经在NH2.x中起作用
在5.2版本中,未保存值
的处理确实发生了变化。
如果我理解正确,此PR修复了某些情况,其中为指定的标识符忽略了提供的未保存值
映射
因此,对于具有指定标识符的实体,您似乎有不正确的未保存值
映射。从给定的数据来看,不清楚您希望NHibernate如何确定实体是否是瞬态的。使用映射,如果Id
不等于Guid,空的NHibernate将触发所有CAC的UPDATE
语句aded实体,这似乎是你看到的确切行为。
若要在实体不在会话中时检查数据库,请将其设置为“未定义”
:
Id(x => x.Id).GeneratedBy.GuidComb().UnsavedValue("undefined");
如果希望它始终保存实体,请将其设置为“any”
阅读并解释所有其他可能的值。同时检查类似的值。非常好;感谢您抓住了这一点-我一直认为问题出在表之间的映射中,而没有意识到的重要性。UnsavedValue
非常好;感谢您抓住了这一点-我一直认为问题很严重在没有意识到.UnsavedValue