Странные исключения, использующие автоматическое отображение FluentNHibernate

У меня есть следующие объекты в моей доменной модели. Группа (совокупный корень) содержит элементы (которые сами являются совокупными корнями), но элемент может одновременно содержаться только одной группой. Код ниже обеспечивает это. Причиной того, что группа имеет коллекцию Предметов, является то, что в домене существуют определенные случаи, которые наиболее логично решаются путем предоставления элементов доступа посредством группы.

Однако когда я добавляю элемент в свою группу, я получаю FatalExecutionEngineError:

Во время выполнения произошла фатальная ошибка. Адрес ошибки был 0x5f0b8442 в потоке 0x99c. Код ошибки 0xc0000005. Эта ошибка может быть ошибкой в ​​CLR или в небезопасных или не поддающихся проверке частях пользовательского кода. Распространенными источниками этой ошибки являются ошибки пользовательского маршалинга для COM-взаимодействия или PInvoke, которые могут повредить стек.

Сразу после этого System.ExecutionEngineException брошен без внутреннего исключения.

ОБНОВИТЬ

Кажется, что _items.Contains(item) проверить в Item.AssignTo Метод вызывает это исключение. Я изначально оставил этот чек из примера, но теперь я добавил его. Когда я снимаю чек, я получаю IndexOutOfRangeException на _items.Add(item); заявление.

Это моя (упрощенная) модель предметной области:

public class Group : Entity
{
    private List<Item> _items = new List<Item>();

    public virtual IEnumerable<Item> Items
    {
        get
        {
            return _items;
        }
    }

    public virtual void Assign(Item item)
    {
        if (_items.Contains(item))
        {
            throw new ArgumentException("Already assigned.", "item");
        }

        _items.Add(item);
    }
}

public class Item : Entity
{
    public virtual Group Group
    {
        get;
        protected set;
    }

    public virtual void AssignTo(Group group)
    {
        group.Assign(this);
        this.Group = group;
    }
}

Отображение FluentNHibernate переопределяет:

// AutoMapping<Group> 
mapping
    .HasMany(n => n.Documents)
    .Access.ReadOnlyPropertyThroughCamelCaseField(Prefix.Underscore)
    .Cascade.Delete()
    .Inverse();

Таким образом, исключение выдается, когда я звоню Item.AssignTo, Когда я удаляю group.Assign(this); линия от Item.AssignTo исключение не возбуждается. Но, конечно, в этом случае Document.Items остается пустым, пока документ не будет извлечен из хранилища через некоторое время.

Что я делаю не так или отсутствует здесь?

1 ответ

Решение

Мальчик, мне интересно, что на самом деле здесь происходит. Я создал отдельный тестовый сценарий, чтобы воспроизвести проблему, но каким-то образом он работал нормально. Пока я экспериментировал с полным проектом, я обнаружил, что изменение private List<Item> _items = new List<Item>(); в private IList<Item> _items = new List<Item>();, решил проблему!

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

Другие вопросы по тегам