Есть ли способ сохранить переходные объекты внутри вложенного объекта.NHibernate сохранение вложенных транзитных объектов перед слиянием
Проблема заключается в том, что ссылка на объект не совпадает с ссылкой на сеанс из-за того, что модель исходит из десериализованного json и затем проецируется в объекты. Поэтому мне нужно использовать Merge на сеансе NHibernate.
Допустим, у нас есть эта упрощенная модель.
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
Я knoew, что я мог proberbly просто сделать что-то вроде:
Foreach (productVariant : Product.ProductVariants){
if(productVariant.Id == 0)
sessiont.save(productVariant);
}
session.Merge(Product);
Но не есть способ сказать, слейте, что я f переходный объект просто сохранить?
Причина позволяет говорить о том, что объект, который вы хотели бы сохранить глубоко вложенным, было бы своего рода сосать шаг через весь вложенный объект просто искать идентификаторы, что составляет 0
Edit:
Looks например, я мог бы переопределить метод equals, чтобы проверить, совпадает ли 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
}
}
Atleast, что они говорят здесь: http://nhibernate.info/blog/2009/08/23/part-5-fixing-the-broken-stuff.html под проблеме # 2
Уже использованный cascade.all, должно быть, допустил ошибку в другом месте –