отображение nhibernate: коллекция с каскадом = «все удаляют сироту», больше не ссылался

У меня есть некоторый probs с моими быстрыми отображениями. У меня есть предприятие с детской коллекцией предприятий т.е. События и EventItems, например.

Если я установил свое каскадное отображение коллекции к AllDeleteOrphan, я получаю следующую ошибку, спасая новое предприятие к DB: NHibernate. HibernateException: коллекция с каскадом = «все удаляют сироту», больше не ссылался случаем предприятия владения: Ядро. Событие. 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();
        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; }
}

Довольно озадаченный здесь. Любые подсказки значительно ценятся.

Чев

18
задан Samuel G 24 January 2010 в 12:30
поделиться

3 ответа

Вам необходимо сопоставить _eventtItems, используя стратегию доступа, так что Nibernate доступа к частным членам вместо свойства. Вы получаете эту ошибку, потому что ссылка на сбору изменена, когда список копируется в новый список в _EventiteMs.tolist () . Попробуйте это:

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
ответ дан 30 November 2019 в 06:50
поделиться

Проверьте это так сообщение: Nhibernate: Удалить рекорд ребенка из родительской коллекции

Комментарии к принятому ответу имеют подобную проблему.

Вы можете попробовать удалить Asreadonly для вашего EventiTems , чтобы проверить, является ли это причина.

0
ответ дан 30 November 2019 в 06:50
поделиться

Я не думаю, что принятый ответ - изящный подход. Возможная проблема здесь в том, что Чев считывает события из базы данных, а затем назначает новый список EventItem свойству EventItems . NHibernate генерирует это исключение, когда вы просто игнорируете предыдущий список дочерних элементов и назначаете новый список дочерних элементов.

Здесь вам нужно сделать следующее:

Если вы хотите отказаться от старых EventItems , сделайте это вместо этого:

events.EventItems.Clear();
events.EventItems.Add(new EventItem { blah blah });
19
ответ дан 30 November 2019 в 06:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: