使用FluentNHibernate自动化的奇怪异常

时间:2011-03-09 11:44:02

标签: c# nhibernate fluent-nhibernate s#arp-architecture automapping

我的域模型中有以下实体。组(聚合根)包含项(它们本身是聚合根),但项目一次只能包含一个组。下面的代码强制执行此操作。组具有项集合的原因是,在域中,通过组提供访问项,在某些情况下可以通过逻辑方式解决这些问题。

当我向我的论坛添加一个项目时,我得到了这个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保持为空,直到稍后从存储库中检索文档。

我在这里做错了什么或错过了什么?

1 个答案:

答案 0 :(得分:0)

男孩,我想知道这里到底发生了什么。我创建了一个独立的测试用例来重现问题,但不知怎的,它运行得很好。当我在整个项目中进行更多实验时,我发现将private List<Item> _items = new List<Item>();更改为private IList<Item> _items = new List<Item>();,解决了问题!

所有这些让我怀疑NHibernate在某处有错误,但我以前对外部库的怀疑大多数都是我自己的代码中的错误,所以我在做这样的指责时要小心。