2012-02-07 115 views
0

我有以下對象模型(基於不能更改的舊式表結構)。將NHibernate映射到「非規範化」表

public class Store 
    Contact BillingContact {get;set;} 
    Contact SetupContact {get;set;} 
    ISet<Contact> Contacts {get;set;} 

在這種情況下,當我創建一個新的商店時,我還將一個新聯繫人添加到聯繫人列表。我還想將該聯繫人設置爲BillingContact和SetupContact的參考。然後將該批次保存爲單個交易。如果我保存商店時未將參考設置爲BillingContact和SetupContact,則一切正常。但是當我設置這些屬性時,NHibernate試圖在Insert之後執行Update來更新引用,並且由於Store尚未被實際插入而出現錯誤。

它看起來像我可能不得不使用觸發器或存儲過程,但我希望有一個NHibernate的方式。

的SQL正在運行的是

INSERT INTO CONTACTS (Id, CompanyId, Name, etc.) Values (1234, NULL, "My Contact", etc.) NOTE: 1234 was retrieved from a sequence 

然後

INSERT INTO company (Id, BillingContactId, SetupContactId) Values (8946, 1234, 1234) 

然後 - 錯誤就是因爲這個

UPDATE CONTACTS SET CompanyId=8946 WHERE CUSTOMER_ID = 1234 AND TimeStamp = xxx 

由於插入尚未提交最後陳述時失敗。

的誤差 行被其它事務更新或刪除(或者未保存值的映射是不正確的)客戶#1234]

+0

你可以包括Sql nHibernate的運行,你的保存代碼和你得到的錯誤嗎? – 2012-02-07 03:24:02

回答

0

您需要配置級聯對那些引用保存更新。這意味着,當您保存或更新一個實體時,它將通過「級聯」保存引用。

http://wiki.fluentnhibernate.org/Getting_started

映射節還有與級聯的例子。

+0

這兩個引用都設置爲SaveUpdate。我相信這個問題是因爲我也將它添加到集合中。 – Steven 2012-02-07 12:31:48