2012-07-04 69 views
1

我使用Fluent來映射父集合 - >兒童收集場景的框架演示我正在做,我是一個NHibernate的新手,所以去容易:)Fluent NHibernate試圖刪除集合與雙向參考

我有我的DTO以下映射:

public class OrderMapping : ClassMap<OrderDTO> 
{ 
    public OrderMapping() 
    { 
     Id(x => x.OrderId); 
     Map(x => x.OrderDate); 
     Map(x => x.Address); 

     HasMany<OrderLineDTO>(x => x.OrderLines).KeyColumn("OrderId").Not.LazyLoad(); 
     Table("`Order`"); 
    } 
} 

public class OrderLineMapping : ClassMap<OrderLineDTO> 
{ 
    public OrderLineMapping() 
    { 
     Id(x => x.OrderLineId); 
     Map(x => x.OrderId).ReadOnly(); 
     Map(x => x.Amount); 
     Map(x => x.Description); 
     References<OrderDTO>(x => x.Order).Column("OrderId"); 
     Table("OrderLine"); 
    } 
} 

的DTO對象被設置爲接收這些值,而這一切工作正常(我Ť因爲我正在處理框架並且LazyLoading尚未完成),所以我暫時沒有使用LazyLoad。

所以,我打開我的測試應用程序 - 將數據加載到兩個網格,與家長和孩子們展示正確

如果我更改子或父對象並試圖保存,我可以看到,爲父/子保存生成的SQL是正確的,並且傳遞給SQL的值已被發現 - 唯一的問題是在更新後,NHib決定要刪除集合?它試圖這樣SQL:

UPDATE OrderLine SET OrderId = null WHERE OrderId = 2 

哪個失敗,因爲該表從訂單行一個FK對OrderLine.OrderId = Order.OrderId秩序,也不能級聯。另外我不明白爲什麼收集需要刪除..

NHib拋出'無法刪除集合'的錯誤 - 這是因爲它試圖從OrderLineDTO子刪除'訂單'引用?

編輯:

其實看DTO它看起來像從我的業務反向映射對象是「訂單」,不包含在每個OrderLineDTO所以我可能已經制定了這一點!恨它,當我做到這一點:)

編輯2:

原來,即使正確地在服務器端重新創建對象,我得到了同樣的問題

什麼想法?

回答

3

想通了 - RTFM:P

在手動:

非常重要提示:如果一個協會的列被聲明爲NOT NULL,NHibernate的可能導致違反約束時,它創建或更新協會。爲了防止這個問題,你必須使用與被標記爲inverse =「true」的許多有價值的結尾(集合或行李)的雙向關聯。請參閱本章後面關於雙向關聯的討論。