无法删除NHibernate中一对多关系中的子实体

无法删除NHibernate中一对多关系中的子实体,nhibernate,nhibernate-mapping,Nhibernate,Nhibernate Mapping,我有一个测试代码: using (var session = factory.OpenSession()) { var animalsCategory = session.Query<Category>().Where(c => c.Name == "Animals").Single(); Assert.AreEqual(3, animalsCategory.Products.Count());

我有一个测试代码:

        using (var session = factory.OpenSession())
        {
            var animalsCategory = session.Query<Category>().Where(c => c.Name == "Animals").Single();
            Assert.AreEqual(3, animalsCategory.Products.Count());
            animalsCategory.Products.ForEach(x => session.Delete(x));
            session.Flush();
        }
我将测试代码更改为以下内容:

        using (var session = factory.OpenSession())
        {
            var animalsCategory = session.Query<Category>().Where(c => c.Name == "Animals").Single();
            Assert.AreEqual(3, animalsCategory.Products.Count());
            //animalsCategory.Products.ForEach(x => session.Delete(x));
            animalsCategory.ClearProducts();
            session.Flush();
        }
使用(var session=factory.OpenSession())
{
var animalscape=session.Query()。其中(c=>c.Name==“动物”).Single();
aresequal(3,animalcategory.Products.Count());
//animalcategory.Products.ForEach(x=>session.Delete(x));
animalsCategory.ClearProducts();
session.Flush();
}
我已经用ClearProducts呼叫取代了ForEach。现在我得到了一个例外:

System.IndexOutOfRangeException:索引超出System.array.Clear(数组、Int32索引、Int32长度)处数组的边界 位于System.Collections.Generic.List`1.Clear()

我还使用while(products.Count>0)循环从集合中删除所有产品,但我也得到了一个例外。如果我不能从集合中删除子对象,有人能告诉我如何删除它们吗

谢谢

编辑1:我惊呆了。。。我刚刚将集合类型(和字段定义)从:

私有列表产品=null;
致:

private IList products=null;
而且代码是有效的。有人能告诉我为什么吗?

问题1-你不能直接从子集合中删除对象。要删除它们,您需要从产品中删除一个项目,然后保存父类别对象。因此,在DDD术语中,您应该只对执行删除,但您已经明白了这一点

问题#2-如果您使用延迟加载,您需要在公共实例成员上使用virtual关键字,并使用接口进行收集,以便NHibernate可以使用代理替换您的属性,这些代理知道如何在首次访问时延迟加载。这是一个类似的例子


您确定您的Category和CategoryMap类现在是这样的吗?不确定您的映射是如何工作的,因为您的公共属性上没有setter,也没有在映射中定义不同的访问策略。

我已经从Fluent导出了映射,这是一对多关系映射XML的一部分:
public class Product : Entity<Product>
{
    public virtual string Name { get; set; }
    public virtual string Description { get; set; }
    public virtual Category Category { get; set; }
    public virtual decimal UnitPrice { get; set; }
    public virtual int ReorderLevel { get; set; }
    public virtual bool Discontinued { get; set; }
}

public class Category : Entity<Category>
{
    private List<Product> products = null;

    public virtual string Name { get; set; }
    public virtual string Description { get; set; }
    public virtual IEnumerable<Product> Products { get { return products; } }
}
    public virtual void ClearProducts()
    {
        products.Clear();
    }
        using (var session = factory.OpenSession())
        {
            var animalsCategory = session.Query<Category>().Where(c => c.Name == "Animals").Single();
            Assert.AreEqual(3, animalsCategory.Products.Count());
            //animalsCategory.Products.ForEach(x => session.Delete(x));
            animalsCategory.ClearProducts();
            session.Flush();
        }
    private List<Product> products = null;
    private IList<Product> products = null;