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