NHibernate - создание записей в связанных таблицах - PullRequest
2 голосов
/ 21 ноября 2008

Hibernate версия: 2.0.1GA

Я пытаюсь добавить одну запись в две таблицы. Таблицы связаны между собой. Я знаю новичка в NHiberate, поэтому я надеюсь, что есть лучший способ сделать это.

В настоящее время я убежден, что единственный способ получить идентификатор вновь добавленной записи - это выполнить SaveOrUpdate; тогда поле идентификатора объекта устанавливается (так как я использую автоинкремент с SQL Server 2005 Express).

Чтобы добавить запись в связанную таблицу, я должен установить поле идентификатора его родителя. Вот что я делаю сейчас:

transaction = session.BeginTransaction(); 

Contact myContact = new Contact(); 

myContact.Company = "ABC Company"; 
myContact.Notes = "test"; 

session.SaveOrUpdate(myContact); 

Address myAddress = new Address(); 
myAddress.IdContact = myContact.Id; 
myAddress.City = "Any City"; 
myAddress.State = "XX"; 
myAddress.Zip = "12345"; 

session.SaveOrUpdate(myContact); 

// Commit transaction 
transaction.Commit(); 

Обратите внимание, что АДРЕС связан с CONTACT. 1 КОНТАКТ на МНОГИЕ АДРЕСА.

Чтобы добавить запись ADDRESS, у меня должен быть соответствующий CONTACT ID, и я считаю, что могу получить только то ПОСЛЕ того, как я создаю запись CONTACT, следовательно, я использовал «SaveOrUpdate» дважды.

Лучший выход?

Спасибо!

1 Ответ

3 голосов
/ 21 ноября 2008

Есть гораздо более простой способ.

Сначала добавьте объект Address в свой объект Contact.

public class Contact
{
   public Contact(){}
   private IList<Address> _addresses;
   public IList<Address> Addresses
   {
          get
          {
                 if(_addresses == null) _addresses = new List<Address>(); 
                 return _addresses 
          }
          set
          {
                 _addresses = value;
          }
   }

Затем в вашем файле сопоставления сопоставьте свойство Address с таблицей адресов вашей базы данных.

Что-то вроде этого в вашем файле сопоставления для Контакта:

<bag name="Addresses" cascade="all-delete-orphan" lazy="false">
  <key column="Address_FK" />
  <one-to-many class="DomainModel.Address, DomainModel" />
</bag>

Затем установите свойство каскада класса Contact на:

  default-cascade="save-update"

Теперь, когда вы заполняете объект Address в Contact и сохраняете объект Contact, коллекция объектов Address автоматически сохраняется.

При необходимости могу привести более полные примеры.

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