nhibernate映射:cascade =“all-delete-orphan”的集合不再被引用 [英] nhibernate mapping: A collection with cascade="all-delete-orphan" was no longer referenced

查看:473
本文介绍了nhibernate映射:cascade =“all-delete-orphan”的集合不再被引用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有我的流利的映射一些probs。例如,我有一个实体的子集合,例如Event和EventItems。

如果我将集合的级联映射设置为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屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆