Отношение «многие ко многим» NHibernate не обновляет таблицу соединений - PullRequest
0 голосов
/ 06 июня 2010

У меня проблемы с сохранением отношений "многие ко многим" с nhibernate. Я искал и смотрел почти все те же вопросы в SO и Google, но ничего не работает. Отдельные классы обновляются корректно, но в таблицу соединений ничего не вставляется.

У меня есть 2 класса: Событие и Категория.

Отображение таково (я обновил два отображения и добавил код):

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>

Код, который генерирует категории Событие +:

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 ]

1 голос
/ 06 июня 2010

Следующий код должен сохранить правильно:

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

В этом случае я сохраняю новую категорию с новым событием, но использование существующих также должно работать.

Важно отметить, что полная противоположность написанного мною кода (событие с коллекцией, содержащей новую категорию) не спасет отношения из-за Inverse.

0 голосов
/ 11 июня 2010

Итак. Я не знаю, что именно, но я получил это работает. Попробовав разные конфигурации, я получил правильную и выкладываю весь код здесь

Отображение в классе 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>

Код, который сохраняет в БД, просто:

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

Транзакция не требуется. Это работает.

0 голосов
/ 07 июня 2010

Вы должны внести все изменения в сущности в рамках одной транзакции. Вы должны начать это непосредственно перед тем, как получать категории.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...