Сохранение графика объектов, которые имели изменения CRUD, обратно в базу данных через NHibernate - PullRequest
1 голос
/ 23 августа 2011

У меня проблема с сохранением графа объектов в базу данных через NHibernate. В частности, я считываю данные из базы данных, инициализирую объекты, используя данные, вносю изменения в объекты и пытаюсь сохранить объект в базе данных с помощью saveorupdate на экземпляре корневого отчета в одной транзакции. Изменения могут включать операции добавления, обновления и удаления объектов.

Я хочу выяснить, сможет ли Nhibernate выяснить, какие типы команд sql (например, update, delete, insert) генерировать, и последовательность выполнения на основе ограничений внешнего ключа базы данных, все в одной транзакции .

Ниже мой код:

public class Report{
   public virtual int Id {get;set;}
   public virtual IList<Report> Children {get;set;}
   public virtual Report Parent {get;set;}
   public virtual IList<Parameter> Parameters {get;set;}
}

public class Parameter{
   public virtual int Id {get;set;}
   public virtual Report Report {get;set;}
}

Отчет может содержать набор параметров, отчеты и родительский отчет.

После инициализации на основе данных, извлеченных из базы данных, вносятся изменения в граф объектов, и попытайтесь сохранить его в базе данных с помощью NHibernate Session.SaveOrUpdate (), передав корневой экземпляр отчета. Однако он выдает исключение, говоря, что нельзя вставить ноль в столбец идентификатора.

Редактировать Я только хочу выяснить, возможно ли для NHibernate генерировать команды sql (CRUD). Я открою другой вопрос, если у меня возникнут проблемы с кодом.

Любой идеал был бы очень признателен.

1 Ответ

2 голосов
/ 23 августа 2011

Вы не показали большого количества кода, чтобы выйти из него, но с Hibernate, вообще говоря, все, что вам нужно сделать, это:

start transaction
load your objects
make whatever changes to the loaded objects
commit transaction

Обратите внимание на отсутствие каких-либо вызовов Save () или SaveOrUpdate().После загрузки объекта с использованием сеанса Hibernate этот объект все еще присоединяется к сеансу, и любые внесенные в него изменения будут распространяться обратно в базу данных при фиксации.Новые объекты, добавленные в существующий (постоянный) график, необходимо сохранить либо напрямую, передав объект в Session.Save (), либо передав его каскадом по взаимосвязи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...