在NHibernate中的一个保存操作中向父实体添加实体列表

时间:2011-11-20 07:52:26

标签: c# nhibernate fluent-nhibernate

我使用Fluent Nhibernate,我的相关实体是:

public class Product
{
    public virtual int ID {get; set;}
    public virtual string Name {get; set;}
    public virtual Supplier Supplier {get; set;}
}

public class Supplier
{
    public virtual int ID {get; set;}
    public virtual string Name {get; set;}
    public virtual List<Product> Products {get; set;}
}

在映射中,供应商在Products + Inverse + Cascade.All上有HasMany,以便一次保存所有产品。 我的产品主键,因此相等成员是使用NH序列生成的Id。

我需要为新供应商创建产品列表。好吧,如果我在从DB获取主键之前将产品添加到列表中,只有第一个产品被添加到列表中,因为所有产品的ID都是0,所以equals方法返回true,列表&#34 ;认为&#34;它已经有了这个产品。

我可以在添加到供应商列表之前逐个保存产品,以便获得数据库的Id值。但是,这并没有使用级联能力。

欢迎提出任何创意建议。

2 个答案:

答案 0 :(得分:2)

很明显,你有意通过Id进行盲目比较来打破平等。

我通常在我的实体中执行覆盖Equals,因为它会在某些不需要的情况下强制加载。

如果你真的想要覆盖Equals,你可以这样做:

public override bool Equals(object obj)
{
    if (Id == 0)
        return ReferenceEquals(this, obj);
    return obj != null && Id == ((Entity)obj).Id;
}

答案 1 :(得分:0)

我不知道我是否100%理解这个问题,但无论如何:

我们使用类似的方法,其中一个事件有一个注册列表。但是,正如您所提到的,我们会在保存实际事件之前先保存注册。当一次添加许多注册时,这会导致N + 1问题,但对于我们的场景来说情况很少。如果我们使用另一个像HiLo这样的id生成器,那么这个问题可能会消失吗?我不知道,因为我们没有时间去研究它。

当我们删除注册时,级联操作成功运行,并且事件的注册集合已正确更新。