我使用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值。但是,这并没有使用级联能力。
欢迎提出任何创意建议。
答案 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生成器,那么这个问题可能会消失吗?我不知道,因为我们没有时间去研究它。
当我们删除注册时,级联操作成功运行,并且事件的注册集合已正确更新。