Странные исключения, использующие автоматическое отображение FluentNHibernate - PullRequest
1 голос
/ 09 марта 2011

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

Однако, когда я добавляю элемент в свою группу,Я получаю это 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 Ответ

0 голосов
/ 11 марта 2011

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

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

...