2014-04-04 143 views
0

當我使用Nhibernate 3更新子項時,子項中刪除的項目不會從數據庫中刪除。當更新子集合時,NHibernate不刪除無用的記錄

案例描述如下

class Parent { 
    string Id; 
    string Name; 
    IList Children; 
} 
class Child { 
    int ChildId; 
    string Name; 
    string Value; 
    Parent parent; 
} 

HDM映射文件顯示以下 Parent.hdm.xml

<bag name="Children" table="ClientsExt" inverse ="true" cascade="all-delete-orphan" lazy="false"> 
    <key column="ChildId"/> 
    <one-to-many class="XXXX.Child, XXX"/> 
</bag> 

Child.hdm.xml

<many-to-one name="Parent" column="Id" class="XXXX.Parent, XXX" not-null="true"/> 

讓我們假設有現有的父其中將數據庫中的一組兒童關聯起來

Parent Table 
Id = "P1", Name = "Test" 
Child Table 
ChildId = 1, Id="P1", Name = "N1", Value = "V1" 
ChildId = 2, Id="P1",Name = "N1", Value = "V2" 
ChildId = 3, Id="P1",Name = "N2", Value = "V3" 

在我的情況下,我需要部分更新孩子。 在更新的Parent中需要更新記錄2 設置值ChildId = 2,值=「NEWVALUE」 和刪除 ChildId = 1,Id =「P1」,Name =「N1」,Value =「V1 「 和ChildId 3將被保留。

,所以我得到了家長從數據庫首先,

var entity = _parentRepo.getById("P1"); 

var children = entity.Children; 

var updatedChildren = children.ToList<Child>; 

var tmpList = new List<Child>(); 

//biz means the business logic object which contains update info 

if (biz.N1.Count > 0){ 

    var existN1 = children.Where(x=>x.Name.Equals("N1")).Select(y=>y.ChildId); 

    int count = existN1.Count; 

    int index = 0; 

    biz.N1.ForEach(x=>{ 

     if(index < count){ 
      tmpList.Add(new Child(){ Id = existN1[index],Name="N1",Value="newValue",Parent = entity }); 
     }else{ 
      tmpList.Add(new Child(){ Name="N1",Value="newValue",Parent = entity }); 
     } 
    }); 

    updatedChildren.RemoveAll(x=>x.Name.Equals("N1")); 

    updateChildren.AddRange(tmpList); 
} 

entity.Children = updateChildren; 
//Save the entity 

然而,在數據庫,記錄2更新值設定爲 「NEWVALUE」,但並沒有消除childID的= 1,ID =「P1 「,名稱=」N1「,值=」V1「。 爲什麼?

在此先感謝。

+0

更改最後幾個代碼,然後生活變得輕鬆。 'entity.Children.Clear(); updateChildren.ForEach(x => entity.Children.Add(x)' – user1438980

回答

1

發生了什麼,就是上面的代碼已經打破了會話原理,拆分了鏈。無論何時我們希望NHibernate做出明智的決定,我們都必須始終關注底層的東西。這是不是按照:

var children = entity.Children; 
var updatedChildren = children.ToList<Child>; // a brand new NHibernate-detached coll 
... 
// operations out of the scope of the NHiberante session 
... 
entity.Children = updateChildren; // broken chain of information 

幕後,NHibernates會將自己的智能採集到entity.Children財產。據跟蹤有關的變化信息(刪除的元素,改變了..)所以如果被要求保存變更... NHibernate的知道...

如果我們把全新的,互不相關,NHibernate的很難找出,有一些元素缺失。沒辦法如何發行DELETE。

解決方案:一直使用entity.Children參考。然後我們會得到我們需要的...

+0

很酷,非常感謝。現在我改變了代碼,並且它可以正常工作,謝謝100萬。 – user1438980

+0

很棒的看看。 –

相關問題