2010-11-03 66 views
24

每次我試圖創建一個特定的實體時,都會得到這個...只是想知道我應該如何去確定原因。如何解決「批量更新返回來自更新的意外行數;實際行數:0;預期:1」的問題?

我使用功能NHibernate自動映射所以也許我沒有正確設置慣例和/或需要重寫出頭的一個或多個映射文件。我已經通過網絡上的一些關於這個問題的帖子,並且很難弄清楚爲什麼發生在我的情況中。

我保存的對象非常簡單。它是引用「公司」實體並具有「地址」實體集合的「人」對象。更新可以在已經存在於數據庫中的現有Person對象上正常工作。

對此提出建議?

感謝-wg

回答

25

的錯誤意味着正在執行的SQL INSERT語句,但它運行後爲0,而不是1,預計行數被SQL Server返回。

有幾個原因,從不正確的映射,更新/有行數關掉INSERT觸發器。

你最好的辦法是配置SQL語句,看看會發生什麼。要做到這一點,要麼打開nHibernate sql logging,要麼使用sql分析器。一旦你有了SQL,你可能會知道原因,如果不嘗試手動運行SQL,看看會發生什麼。

另外我建議你發佈你的映射,因爲它會幫助人們發現任何問題。

+1

是啊。在我的情況下,我使用SharpArchitecture框架,默認未保存的「Id」字段的值爲零,而不是-1,因爲我習慣使用多年。我嘗試覆蓋這個在我的automapping配置,甚至在一個自定義映射類...但仍然將其設置爲0. – wgpubs 2010-11-03 22:03:18

+1

所以你試試這個:Id(a => a.Id).UnsavedValue(0);如果您仍然遇到問題並希望我看看,請將生成的SQL和您的映射添加到您的問題中。 – Iain 2010-11-03 22:57:36

+1

我有這個問題,因爲一個空對象被添加到集合,然後保存正在完成。 – m4tt1mus 2014-10-09 22:54:10

9

就會發生這種情況時觸發(一個或多個)執行額外的DML(數據修改),它影響的行數的查詢。我的解決方案是在觸發器的頂部添加以下內容:

SET NOCOUNT ON; 
0

這可能是由於自動增加主鍵所致。要解決此問題,請勿使用數據集來插入自動遞增值。插入沒有主鍵的數據。

0

當使用INSTEAD OF觸發器定位視圖時,幾乎不可能獲得正確的行數。在深入瞭解源代碼之後,我發現你可以創建一個自定義的持久化器,這會讓NHibernate忽略計數檢查。

public class SingleTableNoResultCheckEntityPersister : SingleTableEntityPersister 
{ 
    public SingleTableNoResultCheckEntityPersister(PersistentClass persistentClass, ICacheConcurrencyStrategy cache, ISessionFactoryImplementor factory, IMapping mapping) 
     : base(persistentClass, cache, factory, mapping) 
    { 
     for (int i = 0; i < this.insertResultCheckStyles.Length; i++) 
     { 
      this.insertResultCheckStyles[i] = ExecuteUpdateResultCheckStyle.None; 
     } 

     for (int i = 0; i < this.updateResultCheckStyles.Length; i++) 
     { 
      this.updateResultCheckStyles[i] = ExecuteUpdateResultCheckStyle.None; 
     } 

     for (int i = 0; i < this.deleteResultCheckStyles.Length; i++) 
     { 
      this.deleteResultCheckStyles[i] = ExecuteUpdateResultCheckStyle.None; 
     } 
    } 
} 
+0

你好,請你讓我知道你是如何使用這個持卡人? – 2017-12-18 23:19:15

相關問題