5

我有一個相當複雜的實體,它在特定數據庫表缺少記錄時不會保存。當記錄存在時,實體保存正確。當記錄不我收到異常:僅當關聯表具有空記錄時,此SqlParameterCollection的Count = N的索引N無效

無效索引N此SqlParameterCollection以計數= N

讀了一堆通過谷歌找到解決方案,並在堆棧溢出最密切相關的問題後, :

我相信我的問題與我的映射文件設置的方式有關。客戶實體參照Person實體。人員映射到我們已閱讀的表格,但不能寫入訪問。當Person實體的記錄不存在時,我會生成異常。如果記錄不存在問題。我已將客戶的人員參考設置爲Nullable()。我也進行了雙重檢查,以確保沒有兩個實體映射的屬性。

這是我的感覺是相關的映射信息,但可以提供更多的需要:

客戶

//more mapping code... 
References(x => x.Person, "snl_id").Nullable(); 
//more mapping code... 

//more mapping code... 
ReadOnly(); 
Id(x => x.SnlId).Column("SNL_ID"); 
//more mapping code... 

爲了進一步使問題複雜化我們有一些令人痛苦的代碼讓NHibernate在Person中執行的更好不存在。我不確定它適用於此,但認爲它足夠適用於我的問題。我們使用下面的代碼,因爲沒有它,NHibernate JIRA將創建​​大量的查詢。該解決方案在此Stack Overflow answer中概述。

客戶的人財物

public virtual Person Person 
{ 
    get 
    { 
     try 
     { 
      var snlId = per.Name; 
      return per; 
     } 
     catch 
     { 
      return null; 
     } 
    } 
    set 
    { 
     per = value; 
    } 
} 

private EPerson per; 

什麼我在我的映射丟失,將導致此異常?我還沒有看到另一個這個問題嗎?

回答

2

雖然Scott從客戶類中刪除snl_id屬性的解決方案修復了問題,但卻導致無法解決問題 - 即使沒有相應的人員表記錄,客戶表中也可能存在snl_id。既然如此,有時我需要訪問snl_id,當我無法通過關聯的Person屬性訪問它時。

我考慮了幾個替代解決方案,但決定創建客戶表的視圖,其中包括客戶表主鍵和來自客戶表的snl_id。然後通過連接將該屬性映射到視圖。

Join("v_cust_id_snl_id", j => j.KeyColumn("cust_id").Map(x => x.SnlId, "snl_id") 

這個改變讓我有我的蛋糕和吃它。我能夠將SnlId屬性保留在客戶身上,但在保存時不再拋出異常。

1

您是否已將snl_id引用爲Customer中的屬性,並且是子對象的主鍵?如果是這樣,這會導致您收到的錯誤。從客戶中移除該財產並使用人來獲取價值。

相關問題