NHibernate为什么要进行UPDATE而不是INSERT?

ala*_*irs 0 nhibernate nhibernate-mapping

继续我在我的播客应用程序中对NHibernate的探索,我遇到了一些奇怪的事情:当我期望INSERT时,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>
Run Code Online (Sandbox Code Playgroud)

情况是:我创建了一个新Podcast对象,从feed更新它(所以Podcast.FeedItems集合属性包含许多FeedItems),现在我将它保存到数据库中ISession.Save().根据NHibernate日志文件判断,该Podcast对象已正确插入数据库,但该FeedItems集合正在UPDATEd中.这是为以下内容生成的SQL Podcast:

INSERT INTO Feeds (
    Uri, IsPublic, Title, Description, Link, Language, Copyright, 
    LastBuildDate, PublishDate, Docs, Webmaster, Author, Subtitle, 
    Summary, OwnerName, OwnerEmail, IsExplicit, ImageUri, Id 
) VALUES (
    @p0, @p1, @p2, @p3, @p4, @p5, @p6, @p7, @p8, @p9, @p10, @p11, 
    @p12, @p13, @p14, @p15, @p16, @p17, @p18
);
Run Code Online (Sandbox Code Playgroud)

这是为FeedItems 生成的SQL :

UPDATE FeedItems SET PublishDate = @p0, Author = @p1, 
    IsExplicit = @p2, Subtitle = @p3, Summary = @p4, 
    Duration = @p5 WHERE Id = @p6;
Run Code Online (Sandbox Code Playgroud)

FeedItems还不一定存在时,我不明白为什么会发生UPDATE .我正在追逐它,因为执行此代码的测试失败了,例外

NHibernate.StaleStateException: Unexpected row count: 0; expected: 1

使用更多日志记录进行更新:在进行了一些更多调整之后,我在NHibernate日志中发现了以下行:

Collection found: [Podcast.FeedItems#GUID], was: [<unreferenced>] (initialized)

ala*_*irs 6

此问题的关键是异常消息

NHibernate.StaleStateException: Unexpected row count: 0; expected: 1

感谢这个问题,我意识到我的ID是由我自己的代码而不是NHibernate分配的,这导致NHibernate认为实体已经被保存了.一旦我删除了代码自动生成新ID,问题就消失了.