2009-11-11 44 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

相关问题