【问题标题】:NHibernate many-to-many relationship does not update join-tableNHibernate 多对多关系不更新连接表
【发布时间】:2010-06-12 02:12:21
【问题描述】:

我无法保存与 nhibernate 的多对多关系。我搜索并查看了 SO 和 google 中几乎所有相同的问题,但没有任何效果。 单个类已正确更新,但连接表中没有插入任何内容。

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

生成Event+Categories的代码是

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

我尝试交换两个映射中的每个参数,但没有任何效果...

你知道我做错了什么或者对这个案例有正确的映射吗?

非常感谢!

【问题讨论】:

  • 你能贴出使用这些类的代码吗?

标签: nhibernate many-to-many


【解决方案1】:

以下代码应正确保存:

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

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

请务必注意,与我编写的代码完全相反(具有包含新类别的集合的事件)将不会保存关系,因为Inverse

【讨论】:

  • 我更新了映射交换逆。你的例子无论如何都不起作用:(
  • 我在这里测试了我的代码,它按预期工作。你的 FlushMode 是什么?事件是如何加载的? AddCategory 的代码是什么?当调用存储库方法时,您是否已验证(使用调试器)事件包含预期的类别?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    不需要交易。它有效。

    【讨论】:

      猜你喜欢
      • 2015-02-04
      • 2020-05-03
      • 2012-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-08
      相关资源
      最近更新 更多