代码之家  ›  专栏  ›  技术社区  ›  Davide Vosti

NHibernate多对多关系不更新联接表

  •  0
  • Davide Vosti  · 技术社区  · 14 年前

    我和nhibernate的多对多关系保存有困难。我在SO和google中搜索并查看了几乎所有相同的问题,但没有任何结果。 单个类被正确更新,但没有在联接表中插入任何内容。

    我有两个班:事件和类别。

    映射如下(我更新了两个映射并添加了一些代码):

    事件:

    <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 回复  |  直到 14 年前
        1
  •  1
  •   Diego Mijelshon    14 年前

    应正确保存以下代码:

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

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

    需要注意的是,与我编写的代码(包含新类别的集合的事件)完全相反的是 因为你的关系 Inverse .

        2
  •  0
  •   Sly    14 年前

    您应该对包含单个事务的实体进行所有更改。你应该在分类之前开始。

        3
  •  0
  •   Davide Vosti    14 年前

    事件类中的映射是:

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

    不需要交易。它起作用了。