2010-06-06 98 views
0

我無法保存與nhibernate的多對多關係。我在SO和谷歌中搜索並查看了幾乎所有相同的問題,但沒有任何結果。 單個類正確更新但沒有任何內容插入到連接表中。NHibernate多對多關係不更新連接表

我有2個類:事件和類別。

的映射是這個(我更新了兩個映射,並添加一些代碼):

事件:

<bag name="Categories" access="field.camelcase-underscore" table="EventCategories" cascade="all-delete-orphan" lazy="true"> 
    <key column="Event"/> 
    <many-to-many class="Category" column="Category"/> 
</bag> 

類別:

<bag name="Events" table="EventCategories" access="field.camelcase-underscore" inverse="true" cascade="all-delete-orphan" lazy="true" > 
    <key column="Category"/> 
    <many-to-many class="Event" column="Event"/> 
</bag> 

誰產生事件+分類代碼是

public void AddEvent(EventInputModel model) 
    { 
     var rawCategories = model.Categories.Split(','); 
     IEnumerable<Category> categories = _repository.GetCategories(rawCategories); 

     foreach (var category in rawCategories) 
     { 
      var c = categories.Where(p => p.Name.ToLower().Equals(category)); 
      if (c.Any()) 
      { 
       model.Event.AddCategory(c.First<Category>()); 
      } 
      else 
      { 
       model.Event.AddCategory(new Category() { Name = category }); 
      } 
     } 

     _repository.Save(model.Event); 

    } 

public void Save(Event p) 
    { 
     using (var t = Session.BeginTransaction()) 
     { 
      Session.SaveOrUpdate(p); 
      t.Commit(); 
     } 
    } 

我試圖在兩個映射中交換每個參數,但沒有任何工作...

你知道我在做什麼錯誤或有正確的映射爲這種情況?

非常感謝!

+0

你可以發佈使用這些clases的代碼嗎? – 2010-06-06 17:26:24

回答

0

所以。我不知道究竟是什麼,但我得到了這個工作。在嘗試不同的配置後,我得到了正確的配置,並在此處發佈整個代碼。

在事件類的映射:

<bag name="Categories" access="field.camelcase-underscore" table="EventCategories" cascade="all-delete-orphan" lazy="true"> 
    <key column="Event"/> 
    <many-to-many class="Category" column="Category"/> 
</bag> 

對於類別是:

<bag name="Events" table="EventCategories" access="field.camelcase-underscore" inverse="true" cascade="all-delete-orphan" lazy="true" > 
    <key column="Category"/> 
    <many-to-many class="Event" column="Event"/> 
</bag> 

誰保存到數據庫的代碼很簡單:

Session.SaveOrUpdate(p); 
Session.Flush(); 

不需要事務。有用。

1

下面的代碼應該正確保存:

using (var tx = session.BeginTransaction()) 
{ 
    var category = new Category { Events = new List<Event> { new Event() } }; 
    session.Save(category); 
    tx.Commit(); 
} 

在這種情況下,我保存了新事件的新範疇,但使用現有的也應該工作。

需要注意的是我寫的代碼(包含一個新的類別集合的事件)完全相反會保存,因爲Inverse的關係是非常重要的。

+0

我更新了映射交換逆。您的示例無論如何都不起作用:( – 2010-06-06 18:26:11

+0

我在這裏測試了我的代碼,它按預期工作。什麼是FlushMode?事件如何加載?AddCategory的代碼是什麼?您是否驗證過(使用調試器)該事件包含預期存儲庫方法被調用時的類別? – 2010-06-06 19:59:20

0

您應該對實體進行所有更改引發單個事務。你應該在獲得類別之前開始它。