我的域模型中有以下实体。组(聚合根)包含项(它们本身是聚合根),但项目一次只能包含一个组。下面的代码强制执行此操作。组具有项集合的原因是,在域中,通过组提供访问项,在某些情况下可以通过逻辑方式解决这些问题。
当我向我的论坛添加一个项目时,我得到了这个FatalExecutionEngineError
:
运行时遇到了致命错误 错误。错误的地址是 0x5f0b8442,在线程0x99c上。错误 代码是0xc0000005。这个错误可能是 CLR中的错误或不安全的错误 用户代码的不可验证部分。 这个bug的常见来源包括 COM-interop的用户编组错误 或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
保持为空,直到稍后从存储库中检索文档。
我在这里做错了什么或错过了什么?
答案 0 :(得分:0)
男孩,我想知道这里到底发生了什么。我创建了一个独立的测试用例来重现问题,但不知怎的,它运行得很好。当我在整个项目中进行更多实验时,我发现将private List<Item> _items = new List<Item>();
更改为private IList<Item> _items = new List<Item>();
,解决了问题!
所有这些让我怀疑NHibernate在某处有错误,但我以前对外部库的怀疑大多数都是我自己的代码中的错误,所以我在做这样的指责时要小心。