繼續我的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