nhibernate映射:不再引用具有cascade ="all-delete-orphan"的集合

Sam*_*l G 18 nhibernate nhibernate-mapping fluent-nhibernate

我正在使用流利映射的一些probs.我有一个实体与实体的子集合,例如Event和EventItems.

如果我将集合的级联映射设置为AllDeleteOrphan,则在将新实体保存到数据库时会出现以下错误:NHibernate.HibernateException:拥有实体实例不再引用具有cascade ="all-delete-orphan"的集合: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; }
}
Run Code Online (Sandbox Code Playgroud)

这里很难过.任何提示非常感谢.

CHEV

Jam*_*Ide 25

您需要使用访问策略映射_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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 10年后,我和Samuel G一样心存感激。:) (2认同)

Has*_*ash 19

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

你需要做的是,

如果你想丢弃旧的EventItems,请改为:

events.EventItems.Clear();
events.EventItems.Add(new EventItem { blah blah });
Run Code Online (Sandbox Code Playgroud)