2016-06-08 5 views
0

У меня есть следующий объект:NHibernate кода - Сохранить объект с неспасенным (переходным) дочерним объектом

public class Item 
{ 
public virtual long ID { get; set; } 
public virtual Version Version { get; set;} 
More properties... 
} 

В отображении объекта У меня есть:

ManyToOne(p => p.Version, m => 
{ 
m.Column("VERSION_ID"); 
} 

Субъект Version также отображается на код и его идентификатор - это автоматически сгенерированная последовательность. Когда я сохраняю Item, я создаю новый Version, присваиваю его Version и сохраняю его. Я хочу сохранить объект Version только после успешного сохранения Item. Теперь он бросает TransientObjectException, когда я это делаю. Можно ли это решить?

ответ

1

Вы не можете сохранить объект, который ссылается на переходный объект через сопоставленное свойство (Item-> Version), если только при сопоставлении свойства, которое вы указываете Cascade.Persist или Cascade.All.

Другое дело, так как вы должны запускать этот код в транзакции, порядок вложений не должен иметь значения. В случае если исключение вызывается (или что-то еще плохое) после сохранения версии, но перед сохранением элемента транзакция должна быть отброшена, и никто не увидит новую версию.

В приведенном ниже фрагменте показано, как можно начать/совершить транзакцию с nHibernate. Обратите внимание, что транзакция будет отменена, если она не будет получена до ее размещения.

using(var session = sessionFactory.OpenSession()) 
using(var transaction = session.BeginTransaction()) 
{ 
    // Do your thing here... 

    transaction.Commit(); 
} 
+0

Итак, каскадирование означает, что дочерний объект будет сохранен вместе с родителем и будет откат в случае ошибки? – user6251216

+1

Cascade.Persit сохраняет объект, на который ссылается, когда родительский объект сохраняется (явно или когда сеанс очищается). Вы несете ответственность за это в транзакции, которую можно отбросить в случае возникновения проблем. Я обновил ответ с помощью фрагмента, показывающего, как это можно сделать. –

+0

Сущность сохраняется отдельно от текущего кода, поэтому доступ к транзакции затруднен. Я думаю, мне придется работать с Cascade. Все для этого, чтобы работать. – user6251216