继续我的NHibernate与我的podcast应用程序的探索,我遇到了一些奇怪的事情:NHibernate正在更新,当我期望一个INSERT。情况是播客与其项目之间简单的一对多关系。这里是我的NHibernate映射:NHibernate为什么要做UPDATE而不是INSERT?
<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>
的情况是:我创建了一个新的Podcast
对象,从进料更新它(这样播客FeedItems
集合属性包含了一些FeedItem
S),我现在保存它通过ISession.Save()
到数据库。通过NHibernate日志文件判断,Podcast
对象已正确插入到数据库中,但FeedItems
集合正在被更新。下面是该Podcast
生成的SQL:
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
);
,这里是为FeedItem
小号生成的SQL:
UPDATE FeedItems SET PublishDate = @p0, Author = @p1,
IsExplicit = @p2, Subtitle = @p3, Summary = @p4,
Duration = @p5 WHERE Id = @p6;
我不知道为什么,当FeedItem
就做不一定是UPDATE正在发生甚至还存在。我追逐下来,因为这个练习的测试代码与异常失败
NHibernate.StaleStateException: Unexpected row count: 0; expected: 1
更新更多的日志:经过一些更多的调整,我发现在NHibernate的日志下面一行:
Collection found: [Podcast.FeedItems#GUID], was: [<unreferenced>] (initialized)
这只适用于ID?我为ID使用GUID,但是我的所有映射都包含一个未保存的属性,它指定 元素上的零GUID。 –
alastairs
2009-11-11 23:47:20
我倾向于使用'System.Guid?'('Nullable'),并且'null'是'unsaved-value'。 –
yfeldblum
2009-11-12 00:02:29
对ID的非空要求是否阻止了这一点? – alastairs 2009-11-12 00:08:02