1

這似乎是一個非常明顯的問題,但我一直未能找到明確的答案。 我使用FluentNHibernate自動映射與DefaultCascade.All()約定。當我將實體添加到一對多集合時,是否需要設置一側的值?

實體正在保存,但是在一對多關係中,即使我通過添加到集合中進行保存,我也不得不在多方面提供一方。 一個例子可能會解釋這更好:

可以說,我已經有了這兩個類:

public class Owner 
{ 
    public virtual IList<PetDog> Dogs { get; set; } 
} 

public class PetDog 
{ 
    public virtual Owner Owner { get; set; } 
} 

爲了新PetDog添加到收藏的狗在一個所有者,我覺得我應該可以撥打

Owner.Dogs.Add(new PetDog()); 

並配置我的ISession。但是,我只是讓所有者保存並且多數民衆贊成。 如果我明確設置

Owner.Dogs.Add(new PetDog { Owner = Owner }) 

它的工作原理。

有沒有辦法避免明確提供該值?

+0

請問你可以用類映射和測試代碼更新你的問題嗎? – mickfold 2013-03-25 18:38:20

回答

0

這可以通過設置逆=在所有者映射假標記所有者類作爲關係的所有者來完成,即

HasMany(x => x.Dogs) 
    .Not.Inverse() 
    .Cascade.AllDeleteOrphan(); 

然後在PetDog表owner_id外鍵將被填充上提交,即

using (var transaction = session.BeginTransaction()) 
{ 
    var order = new Owner() {Dogs = new List<PetDog>()}; 
    order.Dogs.Add(new PetDog()); 
    order.Dogs.Add(new PetDog()); 

    session.Save(order); 
    transaction.Commit(); 
} 

或者,而不是使用事務,你可以調用session.Flush()代替,這將導致新的數據被插入到數據庫,即

var order = new Owner() {Dogs = new List<PetDog>()}; 
    order.Dogs.Add(new PetDog()); 
    order.Dogs.Add(new PetDog()); 

    session.Save(order); 
    session.Flush(); // data persisted to DBMS here. 

請注意,不推薦使用session.Flush()最佳做法。建議使用顯式事務。請參閱Ayende Rahien的blog post瞭解更多詳情。

+0

我必須使用交易才能工作嗎? – 2013-03-27 20:56:30

+0

只是要求導致你包含它們,而我仍然遇到問題 – 2013-03-27 20:57:26

+0

不,你也可以調用'session.Flush()'或者設置'session.FlushMode'爲'FlushMode.Always'。我會更新我的答案,並提供關於可能選項的更多詳細信息。 – mickfold 2013-03-27 23:20:50

相關問題