首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >nhibernate映射:不再引用cascade=为“all-delete-orphan”的集合

nhibernate映射:不再引用cascade=为“all-delete-orphan”的集合
EN

Stack Overflow用户
提问于 2010-01-24 20:30:35
回答 3查看 18.5K关注 0票数 18

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

如果我将集合的级联映射设置为AllDeleteOrphan,则在将新实体保存到DB: NHibernate.HibernateException时会出现以下错误:具有cascade=“all-delete-AllDeleteOrphan”的集合不再被拥有的实体实例引用: Core.Event.EventItems

如果我将级联设置为All,它是否工作正常?下面是我的类和映射文件:

代码语言:javascript
复制
 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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-01-24 22:03:59

您需要使用访问策略映射_EventItems,以便NHibernate访问私有成员而不是属性。之所以会出现这个错误,是因为在将列表复制到_EventItems.ToList<EventItem>()中的新列表时,集合引用会发生变化。试试这个:

代码语言:javascript
复制
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();
        }
    }
}
票数 25
EN

Stack Overflow用户

发布于 2010-05-05 09:13:59

我不认为公认的答案是一个优雅的方法。这里可能出现的问题是,Chev正在从数据库中读取事件,然后为EventItems属性分配一个新的EventItem列表。当您只是忽略以前的子列表并分配一个新的子列表时,NHibernate会抛出此异常。

你需要做的是,

如果您想要丢弃旧的EventItems,请执行以下操作:

代码语言:javascript
复制
events.EventItems.Clear();
events.EventItems.Add(new EventItem { blah blah });
票数 20
EN

Stack Overflow用户

发布于 2010-01-24 20:41:01

查看这篇文章:NHibernate: Delete a child record from the parent collection

对接受的答案的评论也有类似的问题。

您可能希望尝试删除EventItemsAsReadOnly,以检查这是否是原因。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2127016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档