2010-06-06 64 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

您应该对实体进行所有更改引发单个事务。你应该在获得类别之前开始它。