Как добавить отношение «многие ко многим», используя сеанс без состояния в NHibernate?

#nhibernate #many-to-many #stateless

#nhibernate #многие ко многим #без состояния

Вопрос:

У меня есть две сущности, сопоставленные с БД с помощью NHibernate:

 class Entity1
{
    public int Id { get; set; }
    public Entity2[] ReferencedEntities { get; set; }
}

class Entity2
{
    public int Id { get; set; }
}
  

Для Entity1 я также указываю отношение «многие ко многим» к Entity2:

 HasManyToMany(x => x.ReferencedEntities);
  

Как я понимаю, внутренне NHibernate представляет отношение «многие ко многим», создавая некоторую сущность отношения, например:

 class Reference
{
    public Entity1 Entity1 { get; set; }
    public Entity2 Entity2 { get; set; }
}
  

Я добавляю эти объекты в БД, используя сеанс без состояния NHibernate следующим образом:

 using (var session = sessionFactory.OpenStatelessSession())
{
    session.Insert(entity1);
    foreach (var entity2 in entity1.ReferencedEntities)
    {
        session.Insert(entity2);
    }
}
  

Но я также хочу добавить связь между ними. Для этого мне также нужно сохранить объект отношения. Как я могу добавить отношение «многие ко многим», используя сеанс без состояния? Нужно ли указывать объект отношения неявно или есть какой-то другой способ?

Комментарии:

1. Почему вы не используете ISession? В базе данных будет фактическая таблица ссылок, ваш код сеанса без состояния не создаст эти необходимые строки таблицы ссылок.

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

3. Ничего общего со схемой данных? Не уверен, что это значит. Я полагаю, если вам действительно нужно использовать только сеанс без состояния, тогда вам придется самостоятельно сопоставить таблицу ссылок «многие ко многим» и вставить эти строки. Вы действительно работаете против NH, хотя … могли бы также использовать ADO.net ?

Ответ №1:

Сеанс без состояния не выполняет каскадные операции, поэтому он не будет сохранять изменения и ссылки на arrayelements, если они выполняются в других таблицах.

Ненужные выборки часто являются признаком отсутствия / неправильного кода, такого как UnsavedValue() или Equals()``GetHashCode()