2009-11-11 41 views
0

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

回答

4

的關鍵,這個問題是個例外消息

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

感謝this question我意識到,我的ID是被我自己的代碼,而不是由NHibernate的分配,造成的NHibernate認爲實體已經被保存了。一旦我刪除了自動生成新ID的代碼,問題就消失了。

2

我已經看到這種情況發生時,我的元素的unsaved-value屬性不匹配起來反對新實體對應的屬性值。這裏有一個例子:

<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; } 
    } 
} 

在這種情況下,節省了新富會導致NHib產生UPDATE,因爲它認爲該對象已有一個標識。

+0

這隻適用於ID?我爲ID使用GUID,但是我的所有映射都包含一個未保存的屬性,它指定元素上的零GUID。 – alastairs 2009-11-11 23:47:20

+1

我傾向於使用'System.Guid?'('Nullable '),並且'null'是'unsaved-value'。 – yfeldblum 2009-11-12 00:02:29

+1

對ID的非空要求是否阻止了這一點? – alastairs 2009-11-12 00:08:02

相關問題