NHibernate - 在相关表中创建记录

时间:2008-11-21 07:26:53

标签: nhibernate

Hibernate版本:2.0.1GA

我正在尝试在两个表中添加单个记录。这些表是相关的。我有初学者对NHiberate的了解,所以我希望有更好的方法来做到这一点。

目前,我相信我能获得新添加记录的ID的唯一方法是执行SaveOrUpdate;然后对象的ID字段被设置(因为我在SQL Server 2005 Express中使用自动增量)。

为了在相关表中添加记录,我必须设置其父表的ID字段。这就是我现在正在做的事情:

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(); 

请注意,ADDRESS与CONTACT相关。 1每个地址的联系方式。

为了添加ADDRESS记录,我必须有相应的CONTACT ID,我相信我只能在创建CONTACT记录后得到它,因此我使用了两次“SaveOrUpdate”。

更好的出路?

谢谢!

1 个答案:

答案 0 :(得分:3)

有一种更简单的方法。

首先,将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类的cascade属性设置为:

  default-cascade="save-update"

现在,当您在Contact中填充Address对象并保存Contact对象时,Address对象集合将自动保留。

如果需要,我可以做更全面的例子。