2012-08-01 36 views
2

所以是新爲此事NHibernate和流利NHibernate的,我有一些困惑與映射和級聯變化到子對象。功能NHibernate級聯產生,而不是更新他們的新記錄

我有了幾個集合,當我創建一個新的對象它創建的子對象,並將其插入到各自的表一個對象。這很好,很好。然而,當我用表面上的子對象變化來更新父對象時,它會以我想要的方式流動。踢球者是,當看着數據庫我看到,而不是更新子對象記錄,它已經插入新記錄,並從原始記錄中刪除與父對象的關聯,而不僅僅是更新它們。

要增加我們使用自動映射和MappingOverrides額外的解釋。所以這裏簡要介紹一下我正在使用的代碼。

public class ParentObjectOverride : IAutoMappingOverride<ParentObject> 
{ 
    public void Override(AutoMapping<ParentObject> mapping) 
    { 

     mapping.HasMany(x => x.Chid1).Cascade.SaveUpdate().Table("chid1Table"); 
     mapping.HasMany(x => x.Child2).Cascade.SaveUpdate().Table("child2Table"); 

    } 
} 
public class Child1Override : IAutoMappingOverride<Child1> 
{ 
    public void Override(AutoMapping<Child1> mapping) 
    { 
     mapping.References(x => x.ParentObject).Cascade.All(); 
    } 
} 

public class Child2Override : IAutoMappingOverride<Child2> 
{ 
    public void Override(AutoMapping<Child2> mapping) 
    { 
     mapping.References(x => x.ParentObject).Cascade.All(); 
    } 
} 

確實沒有一種情況,子對象獨立地保存在ParentObject中。我試過cascade.all()以及cascade.saveupdate()都產生相同的結果。

我讀過幾個職位有關使用AllDeleteOrphan,但我不明白爲什麼它不應該只是更新子行,而不是製造新的行並刪除舊的。也許我只是不明白映射的概念。

任何援助表示讚賞

+1

你確定你的Clild記錄有當您保存父項ID? – Peter 2012-08-02 08:33:24

+0

是的,如果Child記錄是新的,則id爲0,並且nhibernate在插入時分配id。如果子記錄正在更新,它將傳遞記錄標識作爲父應該保存的子記錄集合的一部分 – TroyB 2012-08-06 17:39:50

回答

1

沒有看到相關的代碼,我將不得不猜測,但在這裏是如何工作的。

// Case 1 
var parent = LoadParentAndChildrenFromDatabase(); 
parent.Child1 = new Child1(); 
parent.Child2 = GetChild2OjbectFromSomewhere(); 
SaveParentAndChildrenToDatabase(); 

// Case 2 
var parent = LoadParentAndChildrenFromDatabase(); 
parent.Child1.SomeProperty = "new_value"; 
parent.Child2.AnotherProperty = 15; 
SaveParentAndChildrenToDatabase(); 

在案例1中,你將永遠插入新行,因爲你的Parent對象實際上是扔出去的老Child對象,並具有完全不同的人取而代之。這就是爲什麼您需要使用DeleteOrphan選項 - 以便在插入新行時,舊的,不再使用的Child行將從數據庫中刪除。

案例2中,但是,應該更新現有行,因爲對象保持不變,只有它的屬性被更新。

我希望這能回答你的問題。

相關問題