nHibernate Поделиться ссылками? - PullRequest
4 голосов
/ 12 декабря 2008

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

Найдены общие ссылки на коллекцию

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

Ответы [ 4 ]

4 голосов
/ 15 мая 2009

Теоретически это означает, что у вас есть 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();
3 голосов
/ 12 декабря 2008

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

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

rel означает отношение (ассоциация) inh обозначает наследование

Исключение выдается после члена объекты были успешно созданы а затем были прочитаны с база данных. После последнего члена объекта была прочитана сделка совершена но это не удается.

как выглядят ваши отображения?

0 голосов
/ 22 сентября 2011

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

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 выдаст «Найденные общие ссылки на коллекцию».

0 голосов
/ 12 декабря 2008

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

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