2012-10-27 157 views
4

我有一對多的關係,不能級聯工作,一旦我設置級聯我只是得到「對象引用一個未保存的瞬態實例...」。流利的nhibernate一對多

我的映射看起來像這樣

public class SharedDetailsMapping : ClassMap<SharedDetails> 
{ 
    public SharedDetailsMapping() 
    { 
     Id(x => x.Id).GeneratedBy.Identity(); 
     HasMany(x => x.Foos); 
    } 
} 

public class FooMapping : ClassMap<Foo> 
{ 
    public FooMapping() 
    { 
     Id(x => x.Id).GeneratedBy.Identity(); 
     References(x => x.SharedDetails).Cascade.SaveUpdate(); 
    } 
} 

這樣

public class Foo 
{ 
    public Foo() 
    { 
     SharedDetails = new SharedDetails(); 
     SharedDetails.Foos.Add(this); 
    } 

    public Foo(SharedDetails sharedDetails) 
    { 
     SharedDetails = sharedDetails; 
     SharedDetails.Foos.Add(this); 
    } 

    public virtual Guid Id { get; set; } 
    public virtual SharedDetails SharedDetails { get; set; } 
} 

public class SharedDetails 
{ 
    public SharedDetails() 
    { 
     Foos = new List<Foo>(); 
    } 

    public virtual Guid Id { get; set; } 
    public virtual IList<Foo> Foos { get; set; } 
} 

然後我想創建的Foo的類,而無需先保存SharedDetails如果新富,就像這樣:

using (var transaction = _session.BeginTransaction()) 
{ 
    var shared = new SharedDetails(); 

    var fooOne = new Foo(shared); 
    _session.SaveOrUpdate(fooOne); 

    var fooTwo = new Foo(shared); 
    _session.SaveOrUpdate(fooTwo); 

    transaction.Commit(); 
} 

無法弄清楚我做錯了什麼,它的工作原理是如果我保存SharedDetail這是爲什麼我有Cascade設置。

回答

6

在你SharedDetailsMapping,修改HasMany添加.Inverse()

public class SharedDetailsMapping : ClassMap<SharedDetails> 
{ 
    public SharedDetailsMapping() 
    { 
     Id(x => x.Id).GeneratedBy.Identity(); 
     HasMany(x => x.Foos) 
      .Inverse(); 
    } 
} 

這指示NHibernate的是Foo擁有的關係,這將有助於其保存對象在正確的順序關係(在這種情況下, SharedDetails必須先保存,因此當保存Foo時,我們有它的ID)。

的目的更多信息/時使用逆:NHibernate's inverse - what does it really mean?

的TL; DNR版本:

如果你在你的類的雙向關係(一側的hasMany,另一方面參考) ,HasMany應該有.Inverse()

+0

問題是我不想首先保存'SharedDetails',我希望在創建'Foo()'時自動創建並保存它。這不可能嗎? – Christian

+0

更改映射不會更改用於創建和保存的示例代碼。你仍然可以做你在你的例子中所做的。然而,這種映射的改變有助於NHibernate找出內部保存的順序。 – HackedByChinese

+0

我已經嘗試添加'反向',但它仍然給出相同的錯誤。保存'SharedDetails'是有效的,但是這會破壞設置Cascade的目的。 – Christian