2015-03-18 7 views
0

Есть ли способ сохранить переходные объекты внутри вложенного объекта.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

ответ

0

Вы должны каскада в ProductVariants списке в отображении Product. NHibernate добавит новый ProductVariant, если он не будет сохранен.

Если все настроено правильно, вам не нужно звонить, а затем любой метод SaveOrUpdate() или Merge().

+0

Уже использованный cascade.all, должно быть, допустил ошибку в другом месте –

Смежные вопросы