В моей модели предметной области есть следующие объекты. Группа (совокупный корень) содержит элементы (которые сами являются совокупными корнями), но элемент может одновременно содержаться только в одной группе. Код ниже обеспечивает это. Причина, по которой группа имеет коллекцию Items, заключается в том, что в домене есть определенные случаи, которые наиболее логично решаются путем предоставления доступа к элементам посредством группы.
Однако когда я добавляю элемент в свою группу, я получаю 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
останется пустым, пока документ не будет извлечен из репозитория позже.
Что я здесь делаю не так или не хватает?
_items.Contains(item)
. Изначально я пропустил это утверждение. Между прочим, если я удалю этот чек, я получуIndexOutOfRangeException
на_items.Add(item);
. - person Sandor Drieënhuizen   schedule 09.03.2011IEnumerable<Item>
наIList<Item>
? - person k3b   schedule 09.03.2011