有没有办法在嵌套对象中保存瞬态对象。
问题是对象引用与会话内的对象引用不同,因为模型来自反序列化的json,然后投影到实体中。因此我需要在NHibernate会话上使用Merge。
假设我们有这种简化模型。
class Product
{
public int Id {get; protected set;}
Public List<ProductVariant> ProductVariants {get; set;}
}
class ProductVariant
{
public int Id {get; protected set;}
//more stuff nested deeper
}
保存对象包含
Product -> id = 1
-> ProductVariants -> ProductVariant -> id = 1
|> ProductVariant -> id = 2
|> ProductVariant -> id = 0 //Transient object
这样:
session.SaveOrUpdate(Product) //wont work, different object reference to the same identity
session.Merge(Product) //Wont work, there is a transient object
我知道我可以简单地做一些像:
Foreach (productVariant : Product.ProductVariants){
if( productVariant.Id == 0)
sessiont.save(productVariant);
}
session.Merge(Product);
但是,有没有办法告诉,合并,如果瞬态对象只是保存?
原因让我们说你要保存的对象是深层嵌套的,只是为了寻找0的Ids,它会很难通过整个嵌套对象。
编辑:
看起来我可以覆盖equals方法来检查Id是否相同,并且是同一类型的对象,但是我认为这是一个坏主意。即使设置ID受到保护。但是,覆盖Equals方法意味着我可以使用SaveOrUpdate,这是更好的。
像:
class Product
{
public int Id {get; protected set;}
Public List<ProductVariant> ProductVariants {get; set;}
public override bool Equals(Object obj)
{
if (obj == null || GetType() != obj.GetType())
return false;
Product otherProduct = (Product)obj;
return otherProduct.Id == Id
}
}
class ProductVariant
{
public int Id {get; protected set;}
//more stuff nested deeper
public override bool Equals(Object obj)
{
if (obj == null || GetType() != obj.GetType())
return false;
ProductVariant otherProduct = (ProductVariant)obj;
return otherProduct.Id == Id
}
}
至少他们在这里说的是:http://nhibernate.info/blog/2009/08/23/part-5-fixing-the-broken-stuff.html问题#2
答案 0 :(得分:0)
您需要在ProductVariants
的映射中级联 Product
列表。如果新的ProductVariant
没有保留,它将添加新的SaveOrUpdate()
。
如果一切设置正确,则无需拨打任何Merge()
或{{1}}方法。