NHibernate mapping: коллекция с cascade= "all-delete-orphan" больше не ссылалась
У меня есть некоторые проблемы с моими беглыми отображениями. У меня есть сущность с дочерней коллекцией сущностей, например Event и EventItems.
Если я установлю свое каскадное отображение коллекции на AllDeleteOrphan, то при сохранении новой сущности в БД я получу следующую ошибку: NHibernate на.HibernateException: коллекция с cascade= "all-delete-orphan" больше не ссылается на экземпляр сущности-владельца: Core.Событие.EventItems
Если я установлю каскад на все, он будет работать нормально? Ниже приведены мои классы и файлы отображения:
public class EventMap : ClassMap<Event>
{
public EventMap()
{
Id(x => x.Id, "Id")
.UnsavedValue("00000000-0000-0000-0000-000000000000")
.GeneratedBy.GuidComb();
Map(x => x.Name);
HasMany(x => x.EventItems)
.Inverse()
.KeyColumn("EventId")
.AsBag()
.Cascade.AllDeleteOrphan();
}
}
public class EventItemMap : SubclassMap<EventItem>
{
public EventItemMap()
{
Id(x => x.Id, "Id")
.UnsavedValue("00000000-0000-0000-0000-000000000000")
.GeneratedBy.GuidComb();
References(x => x.Event, "EventId");
}
}
public class Event : EntityBase
{
private IList<EventItem> _EventItems;
protected Event()
{
InitMembers();
}
public Event(string name)
: this()
{
Name = name;
}
private void InitMembers()
{
_EventItems = new List<EventItem>();
}
public virtual EventItem CreateEventItem(string name)
{
EventItem eventItem = new EventItem(this, name);
_EventItems.Add(eventItem);
return eventItem;
}
public virtual string Name { get; private set; }
public virtual IList<EventItem> EventItems
{
get
{
return _EventItems.ToList<EventItem>().AsReadOnly();
}
protected set
{
_EventItems = value;
}
}
}
public class EventItem : EntityBase
{
protected EventItem()
{
}
public EventItem(Event @event, string name):base(name)
{
Event = @event;
}
public virtual Event Event { get; private set; }
}
Довольно тупиковый здесь. Любые советы очень ценю.
Чев
3 ответа:
Вам нужно сопоставить _EventItems, используя стратегию доступа, чтобы NHibernate получил доступ к частному члену вместо свойства. Вы получаете эту ошибку, потому что ссылка на коллекцию изменяется, когда список копируется в новый список в
_EventItems.ToList<EventItem>()
. Попробуйте это:public class EventMap : ClassMap<Event> { public EventMap() { Id(x => x.Id, "Id") .UnsavedValue("00000000-0000-0000-0000-000000000000") .GeneratedBy.GuidComb(); Map(x => x.Name); HasMany(x => x.EventItems) .Access.PascalCaseField(Prefix.Underscore) .Inverse() .KeyColumn("EventId") .AsBag() .Cascade.AllDeleteOrphan(); } } }
Я не думаю, что принятый ответ-это элегантный подход. Возможная проблема здесь заключается в том, что Chev считывает события из базы данных и затем присваивает новый список
EventItem
свойствуEventItems
. NHibernate создает это исключение, когда вы просто игнорируете предыдущий список дочерних элементов и назначаете новый список дочерних элементов.То, что вам нужно сделать здесь,
Если вы хотите отказаться от старого
EventItems
, Сделайте это вместо этого:events.EventItems.Clear(); events.EventItems.Add(new EventItem { blah blah });
Проверьте это сообщение так: NHibernate: удалить дочернюю запись из родительской коллекции
Комментарии к принятому ответу имеют аналогичный вопрос.
Вы можете попробовать удалить
AsReadOnly
для вашегоEventItems
, чтобы проверить, является ли это причиной.