В моей доменной модели есть следующие объекты.Группа (совокупный корень) содержит элементы (которые сами являются совокупными корнями), но элемент может содержаться только одной группой одновременно.Код ниже обеспечивает это.Причиной того, что группа имеет коллекцию Предметов, является то, что в домене есть определенные случаи, которые наиболее логично решаются путем предоставления элементов доступа посредством группы.
Однако, когда я добавляю элемент в свою группу,Я получаю это 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
остается пустым до тех пор, пока документ не будет извлечен из хранилища позднее.
Что я делаю неправильно или отсутствует здесь?