При сохранении объекта возникает следующее исключение:
Found shared references to a collection
Кто-нибудь знает что это значит?





У вас есть ссылка на какой-либо из объектов коллекции где-нибудь еще? Другой сеанс, возможно, или даже в том же сеансе в другом объекте? Убедитесь, что при доступе к спящему режиму вы управляете ТОЛЬКО ссылкой на эти объекты в любом сеансе спящего режима.
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. При сопоставлении присоединенного подкласса вы должны сопоставлять только те свойства, которые уникальны для уровня иерархии, которую вы сопоставляете:
Being вы сопоставляете только свойство DnaSequence.Animal вы сопоставляете только свойство Relatives.Human вы сопоставляете только свойство Name.Если вы случайно сопоставите Relatives в сопоставлении Human, NHibernate выдаст «Найденные общие ссылки на коллекцию».
Было бы здорово, если бы вы могли отметить любой из предоставленных ответов как решение или записать свое собственное решение, если вы его нашли.