NHibernate多对多关系不会更新join-table

时间:2010-06-06 16:37:39

标签: nhibernate many-to-many

我在使用nhibernate保存多对多关系时遇到了麻烦。我搜索并查看了几乎每个相同的问题在SO和谷歌但没有任何作用。 单个类正确更新,但在连接表中没有插入任何内容。

我有两个课程:活动和类别。

映射是这样的(我更新了两个映射并添加了一些代码):

事件:

<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();
        }
    }

我试图在两个映射中交换每个参数但没有任何作用......

你知道我做错了什么,或者对于这种情况有正确的映射吗?

非常感谢!

3 个答案:

答案 0 :(得分:1)

以下代码应正确保存:

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

在这种情况下,我正在使用新事件保存新类别,但使用现有类别也应该有效。

重要的是要注意,与我编写的代码完全相反(带有包含新类别的集合的事件)Inverse而保存关系。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

因此。我不知道究竟是什么,但我得到了这个工作。在尝试不同的配置后,我得到了正确的配置,我在这里发布了整个代码。

Event类中的映射是:

<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>

保存到db的代码只是:

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

无需交易。它有效。