nHibernate正在尝试用SQL更新我刚刚创建的实体,而不是插入?

nHibernate正在尝试用SQL更新我刚刚创建的实体,而不是插入?,nhibernate,Nhibernate,一个项目参与者可能是许多组的成员,一个组可能有许多项目参与者 我发现,当我创建2个ProjectParticipants(这很有效),然后用3个新组填充项目组集合,并将参与者添加到相关组(A组有参与者1,B组有参与者2,C组有参与者1和2)时,我遇到了“StaleStateException-批量更新从更新返回意外的行计数;实际行数:0,预期为:3”。我希望nHibernate插入新组,但它正在运行更新查询,并拒绝承认它们不存在。它还没有将参与者分配到这些组 以下是映射: //ProjectMa

一个项目参与者可能是许多组的成员,一个组可能有许多项目参与者

我发现,当我创建2个ProjectParticipants(这很有效),然后用3个新组填充
项目组
集合,并将参与者添加到相关组(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