我的流利的映射有一些问题。我有一个实体,它有一个子实体集合,例如Event和EventItems。
如果我将集合的级联映射设置为AllDeleteOrphan,则在将新实体保存到DB: NHibernate.HibernateException时会出现以下错误:具有cascade=“all-delete-AllDeleteOrphan”的集合不再被拥有的实体实例引用: Core.Event.EventItems
如果我将级联设置为All,它是否工作正常?下面是我的类和映射文件:
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; }
}在这里被难住了。任何建议都非常感谢。
Chev
发布于 2010-01-24 22:03:59
您需要使用访问策略映射_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();
}
}
}发布于 2010-05-05 09:13:59
我不认为公认的答案是一个优雅的方法。这里可能出现的问题是,Chev正在从数据库中读取事件,然后为EventItems属性分配一个新的EventItem列表。当您只是忽略以前的子列表并分配一个新的子列表时,NHibernate会抛出此异常。
你需要做的是,
如果您想要丢弃旧的EventItems,请执行以下操作:
events.EventItems.Clear();
events.EventItems.Add(new EventItem { blah blah });发布于 2010-01-24 20:41:01
查看这篇文章:NHibernate: Delete a child record from the parent collection
对接受的答案的评论也有类似的问题。
您可能希望尝试删除EventItems的AsReadOnly,以检查这是否是原因。
https://stackoverflow.com/questions/2127016
复制相似问题