为什么NHibernate要进行更新而不是插入?

为什么NHibernate要进行更新而不是插入?,nhibernate,nhibernate-mapping,Nhibernate,Nhibernate Mapping,通过我的播客应用程序继续我在NHibernate中的探索,我遇到了一些奇怪的事情:NHibernate在我期望插入的时候正在更新。这种情况是播客和它的项目之间简单的一对多关系。以下是我的NHibernate映射: <hibernate-mapping assembly="App.DataModel"> <class name="Feed" table="Feeds"> <!-- snip --> <bag name="FeedItem

通过我的播客应用程序继续我在NHibernate中的探索,我遇到了一些奇怪的事情:NHibernate在我期望插入的时候正在更新。这种情况是播客和它的项目之间简单的一对多关系。以下是我的NHibernate映射:

<hibernate-mapping assembly="App.DataModel">
  <class name="Feed" table="Feeds">
    <!-- snip -->
    <bag name="FeedItems" table="FeedItems" cascade="all">
      <key column="FeedId" />
      <one-to-many class="FeedItem" />
    </bag>
  </class>
</hibernate-mapping>
下面是为
FeedItem
s生成的SQL:

UPDATE FeedItems SET PublishDate = @p0, Author = @p1, 
    IsExplicit = @p2, Subtitle = @p3, Summary = @p4, 
    Duration = @p5 WHERE Id = @p6;
我不明白为什么在
FeedItem
s还不一定存在的情况下会发生更新。我正在追查这一点,因为测试这段代码的测试由于异常而失败

NHibernate.StaleStateException:意外的行计数:0;预期:1

更新更多日志记录:经过更多调整后,我在NHibernate日志中发现了以下行:


找到的集合:[Podcast.FeedItems#GUID]是:[](已初始化)

当我元素上的
未保存值
属性与新实体的相应属性值不匹配时,我看到了这种情况。下面是一个例子:

<class name="Foo">
  <id name="ID" unsaved-value="-1" type="Int32">
    <generator class="native"/>
  </id>
</class>

在这种情况下,保存一个新的Foo将导致NHib生成一个更新,因为它认为对象已经有了一个标识。

这个问题的关键是异常消息

NHibernate.StaleStateException:意外的行计数:0;预期:1


多亏了我意识到我的ID是由我自己的代码分配的,而不是由NHibernate分配的,这使得NHibernate认为实体已经被保存了。一旦我删除了自动生成新ID的代码,问题就消失了

这是否仅适用于ID?我正在为ID使用GUID,但我的所有映射都包含一个未保存的值属性,该属性指定元素上的零GUID。我倾向于使用
System.GUID?
Nullable
),并将
null
作为
未保存的值
。对IDs的非null要求是否阻止了这一点?
<class name="Foo">
  <id name="ID" unsaved-value="-1" type="Int32">
    <generator class="native"/>
  </id>
</class>
public class Foo 
{
  private int _id = 0;
  public int ID {
    get { return _id; }
    set { _id = value; }
  }
}