Почему, когда я добавляю предмет в коллекцию сумок, nhibernate автоматически вставляется в базу данных? - PullRequest
0 голосов
/ 03 апреля 2012

Я работаю с NHibernate.У моего класса А есть сумка с предметами B.поэтому, когда я пытаюсь:

var A = new A();
var B = new B();

A.Bs.Add(B);  // Here NHibernate insert in database

Nhibernate автоматически вставить в таблицу отношений в базе данных.Но я хочу вставить NHibernate, когда я сохраняю или обновляю объект A:

var A = new A();
var B = new B();

A.Bs.Add(B);
session.saveOrUpdate(A);  // Here i want to NHibernate insert in database

Это возможно или так работает NHibernate?Спасибо.

Ответы [ 3 ]

0 голосов
/ 04 апреля 2012

Итак, когда вы используете вызов A.Bs.Add(B); NHibernate, вставьте его, потому что, вероятно, A является постоянным объектом (вы загрузили его из базы данных), и он обновил все зависимости. Вы можете использовать session.Evict (), чтобы отсоединить объект от сессии, а затем использовать session.saveOrUpdate(A);, чтобы прикрепить. В этом случае вставка будет здесь: session.saveOrUpdate(A);

0 голосов
/ 04 апреля 2012

На самом деле вы, вероятно, DO используете транзакции.Потому что по умолчанию NHibernate не будет вставлять при добавлении сущности в другую коллекцию.Я проверил это поведение на своей тестовой модели:

Blog blog = new Blog();
blog.Name = "test";
blog.CreatedAt = DateTime.Now;
session.SaveOrUpdate(blog);

var item = new Post(blog);
blog.Posts.Add(item); // item.Id still 0 here. That mean that no insert was made

Итак, проверьте объем транзакции.И еще одна вещь, которая может повлиять на режим сброса сессии.Но даже с таким кодом

Blog blog = new Blog();
session.FlushMode = FlushMode.Always;
session.SaveOrUpdate(blog);

var item = new Post(blog);
blog.Posts.Add(item);
var blogs = session.QueryOver<Blog>().List();

Id по-прежнему равен 0. Так что ищите транзакции или сессию. Флэш-вызовы

0 голосов
/ 04 апреля 2012

Возможно, вам понадобится использовать транзакции

using (ITransaction transaction = session.BeginTransaction())
{
  var A = new A();
  var B = new B();
  A.Bs.Add(B);
  session.saveOrUpdate(A);
  transaction.commit();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...