Ссылки на nHibernate?

При сохранении объекта возникает следующее исключение:

Found shared references to a collection

Кто-нибудь знает что это значит?

Было бы здорово, если бы вы могли отметить любой из предоставленных ответов как решение или записать свое собственное решение, если вы его нашли.

Asbjørn Ulsberg 22.09.2011 18:18
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
1
5 716
4

Ответы 4

У вас есть ссылка на какой-либо из объектов коллекции где-нибудь еще? Другой сеанс, возможно, или даже в том же сеансе в другом объекте? Убедитесь, что при доступе к спящему режиму вы управляете ТОЛЬКО ссылкой на эти объекты в любом сеансе спящего режима.

быстрый гугл говорит

  rel   Group n --- 1 User
         m             ^
         |             | inh
         |  rel        |
         --------- n Member

rel stands for relation (association) inh stands for inheritance

The exception is thrown after Member objects have successfully been created and then have been read from the database. After the last Member object was read the transaction is committed but this fails.

как выглядят ваши сопоставления?

Теоретически это означает, что у вас есть 2 записи, которые содержат одну и ту же ссылку на другой объект. На уровне базы данных это, скорее всего, слабый объект, однако на уровне кода он, скорее всего, будет представлен в виде коллекции.

Вы скопировали другую коллекцию записей? Например.

Blog blog1 =  Blog.Find(1);
Blog blog2 = new Blog();
blog2.Entries =  blog1.Entries;
blog2.Save();

Этот код предназначен для ActiveRecords, но, поскольку он построен поверх nHibernate, основные принципы остаются теми же.

Когда я столкнулся с этой проблемой, интересно было то, что коллекция, на которую она ссылается, была неправильной. Это было другое.

Если это ваша проблема, попробуйте перебрать каждый элемент и вместо этого назначить его новой коллекции. Например.

Blog blog1 =  Blog.Find(1);
Blog blog2 = new Blog();

foreach (BlogEntry entry in blog1.Entries)
   blog2.Entries.Add(entry);
blog2.Save();

По моему опыту, эта ошибка возникает, когда у вас есть сопоставление присоединенного подкласса, в котором унаследованное свойство отображается как в суперклассе, так и в подклассе. Допустим, у вас есть эти объекты:

public class Being
{
    public string DnaSequence { get; protected set; }
}

public class Animal : Being
{
    public IList<Animal> Relatives { get; protected set; }
}

public class Human : Animal
{
    public string Name { get; protected set; }
}

В вашем отображении Human важно, чтобы вы не отображали свойство Relatives. При сопоставлении присоединенного подкласса вы должны сопоставлять только те свойства, которые уникальны для уровня иерархии, которую вы сопоставляете:

  1. Для Being вы сопоставляете только свойство DnaSequence.
  2. Для Animal вы сопоставляете только свойство Relatives.
  3. Для Human вы сопоставляете только свойство Name.

Если вы случайно сопоставите Relatives в сопоставлении Human, NHibernate выдаст «Найденные общие ссылки на коллекцию».

Другие вопросы по теме