nhibernate映射:cascade =“all-delete-orphan”的集合不再被引用 [英] nhibernate mapping: A collection with cascade="all-delete-orphan" was no longer referenced
问题描述
如果我将集合的级联映射设置为AllDeleteOrphan,则在保存时出现以下错误一个新的实体到数据库:
NHibernate.HibernateException:cascade =all-delete-orphan的集合不再被拥有的实体实例引用:Core.Event.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();
引用(x => x.Event,EventId);
$ b公共类Event:EntityBase
{
private IList< EventItem> _EventItems;
$ b保护事件()
{
InitMembers();
$ b $ public Event(string name)
:this()
{
Name = name;
private void InitMembers()
{
_EventItems = new List< EventItem>();
$ b public virtual EventItem CreateEventItem(string name)
{
EventItem eventItem = new EventItem(this,name);
_EventItems.Add(eventItem);
返回eventItem;
}
public virtual string Name {get;私人设置}
公共虚拟IList< EventItem> EventItems
{
get
{
return _EventItems.ToList< EventItem>()。AsReadOnly();
}
保护集
{
_EventItems = value;
$ b public class EventItem:EntityBase
{
protected EventItem()
{
}
$ b public EventItem(Event @event,string name):base(name)
{
Event = @event;
}
public virtual Event Event {get;私人设置}
}
任何提示非常感谢。
Chev
_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();
}
}
}
I am having some probs with my fluent mappings. I have an entity with a child collection of entities i.e Event and EventItems for example.
If I set my cascade mapping of the collection to AllDeleteOrphan I get the following error when saving a new entity to the DB: NHibernate.HibernateException : A collection with cascade="all-delete-orphan" was no longer referenced by the owning entity instance: Core.Event.EventItems
If I set the cascade to All it works fine? Below are my classes and mapping files:
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; }
}
Pretty stumped here. Any tips greatly appreciated.
Chev
You need to map _EventItems using an access strategy so that NHibernate access the private member instead of the property. You're getting this error because the collection reference is changed when the list is copied to a new List in _EventItems.ToList<EventItem>()
. Try this:
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();
}
}
}
这篇关于nhibernate映射:cascade =“all-delete-orphan”的集合不再被引用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!