代码之家  ›  专栏  ›  技术社区  ›  Samuel Goldenbaum

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

  •  17
  • Samuel Goldenbaum  · 技术社区  · 16 年前

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

    如果我将级联设置为所有,它可以正常工作吗?下面是我的类和映射文件:

     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 回复  |  直到 16 年前
        1
  •  26
  •   Jamie Ide    16 年前

    您需要使用访问策略映射_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();
            }
        }
    }
    
        2
  •  20
  •   harriyott Erik Funkenbusch    10 年前

    EventItem 名单 EventItems 财产。当您忽略以前的子列表并分配新的子列表时,NHibernate会引发此异常。

    你需要做的是,

    如果你想丢弃旧的 事件项

    events.EventItems.Clear();
    events.EventItems.Add(new EventItem { blah blah });
    
        3
  •  0
  •   Community Mohan Dere    9 年前

    查看此SO帖子: NHibernate: Delete a child record from the parent collection

    您可能需要尝试删除 AsReadOnly 为了你的 EventItems

    推荐文章