为什么NHibernate要进行更新而不是插入?
通过我的播客应用程序继续我在NHibernate中的探索,我遇到了一些奇怪的事情:NHibernate在我期望插入的时候正在更新。这种情况是播客和它的项目之间简单的一对多关系。以下是我的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
<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; }
}
}