2011-12-02 171 views
16

我很难弄清楚NH例外:批更新从更新中返回了意外的行计数;实际行数:0;预计:1

批更新从更新返回意外的行数;实际行 count:0;预计:1

我的达尔代码:

public T Save(T item) 
     { 
      using (ISession session = NHibernateHelper.GetSession()) 
      { 
       using (var transaction = session.BeginTransaction()) 
       { 
        session.SaveOrUpdate(item); 

        transaction.Commit(); 

        return item; 
       } 
      } 
     } 

我log4net的文件:

命令0:UPDATE Metadata_FriendDetails SET用户ID = @ P0,电子邮件= @ P1, 名称= @ p2 WHERE FriendId = @ p3; @ p0 = a358ab9d-d481-4bdd-8cb2-18ddc8898c70 [类型:Guid(0)],@ p1 = '[email protected]'[类型:字符串(4000)],@ @ p2 ='myFriend'[类型:字符串 (4000)],@ p3 = 2ea35658-edb1-43e3-b848-e1915d1042df [类型:GUID(0)]

2011-12-02 13:06:49750 [代理人:适配器运行线程测试 'SaveFriendDetails_Test' id为 “17016e48- 1ff4-4dea-8536-6aa3b24e5fb7' ] DEBUG NHibernate.AdoNet.AbstractBatcher - 闭IDbCommand的,开放的 IDbCommands:0 2011-12-02 13:06:49751 [代理:适配器运行线程 测试 'SaveFriendDetails_Test',且id '17016e48-1ff4-4dea-8536-6aa3b24e5fb7']错误 NHibernate.Event.Default.AbstractFlushingEventListener - 不能 同步数据库状态与会话 NHibernate.StaleStateException:批量更新返回意外的行 从更新计数;实际行数:0;预计:1

有没有人看到这个问题?

TIA

+2

一对夫妇possiblites的,你的对象被分离,并从未在DATABSE actaully创建的,所以没有原单对象行更新。或者更新之前,表中的某个值已更改。我认为这是一个可重复的怀疑?在创建,更新和保存对象的过程中发布一些代码段会很有帮助。 – user957902

+0

我认为你应该写异常的来源,例外。它会更有帮助。 – Joshi

+0

added.i can not see why:NHibernate.Event.Default.AbstractFlushingEventListener - 无法使数据库状态与会话NHibernate同步 –

回答

32

的问题是,在保存时,我不应该提供的id值和更新,我必须为它供给。

+1

只要您能够,请确保将此答案标记为已接受,以便其他人知道有解决方案。 –

3

保存前必须将Id对象设置为null

例如:

obj.setId(null); 
objectDao.save(obj); 
+0

如果你有一个Integer ID你必须使用:obj.setId(0) - 所以它的工作原理。不适合我,因为我已将Id设置为-1 – bernhardrusch

相关问题