使用NHibernate,更新父对象时如何添加子对象?

使用NHibernate,更新父对象时如何添加子对象?,nhibernate,nhibernate-mapping,Nhibernate,Nhibernate Mapping,我在Person对象和Address对象之间有一个简单的父/子关系。数据库中存在Person对象。在对Person进行Get之后,我将一个新的Address对象添加到父对象的Address子对象列表中,并对Person对象进行一些其他更新。最后,我对Person对象进行更新。通过一个SQL跟踪窗口,我可以看到Person表中Person对象的更新以及Address表中地址记录的插入 问题是,在执行更新后,AddressId(Address对象上的主键)仍然设置为0,这是您首次初始化Address

我在Person对象和Address对象之间有一个简单的父/子关系。数据库中存在Person对象。在对Person进行Get之后,我将一个新的Address对象添加到父对象的Address子对象列表中,并对Person对象进行一些其他更新。最后,我对Person对象进行更新。通过一个SQL跟踪窗口,我可以看到Person表中Person对象的更新以及Address表中地址记录的插入

问题是,在执行更新后,AddressId(Address对象上的主键)仍然设置为0,这是您首次初始化Address对象时的默认值。我已验证,当我进行加法时,此值设置正确。在尝试将子对象添加为NHibernate更新的一部分时,这是一个已知问题吗?下面是示例代码和映射文件

谢谢

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
  <class name="BusinessEntities.Wellness.Person,BusinessEntities.Wellness" table="Person" lazy="true" dynamic-insert="true" dynamic-update="false"> 
    <id name="Personid" column="PersonID" type="int"> 
      <generator class="native" /> 
    </id> 
    <version type="binary" generated="always" name="RecordVersion" column="`RecordVersion`"/> 
    <property type="int" not-null="true" name="Customerid" column="`CustomerID`" /> 
    <property type="AnsiString" not-null="true" length="9" name="Ssn" column="`SSN`" /> 
    <property type="AnsiString" not-null="true" length="30" name="FirstName" column="`FirstName`" /> 
    <property type="AnsiString" not-null="true" length="35" name="LastName" column="`LastName`" /> 
    <property type="AnsiString" length="1" name="MiddleInitial" column="`MiddleInitial`" /> 
    <property type="DateTime" name="DateOfBirth" column="`DateOfBirth`" /> 
    <bag name="PersonAddresses" inverse="true" lazy="true" cascade="all"> 
      <key column="PersonID" /> 
      <one-to-many class="BusinessEntities.Wellness.PersonAddress,BusinessEntities.Wellness" / 
    </bag> 
  </class> 
</hibernate-mapping>

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
  <class name="BusinessEntities.Wellness.PersonAddress,BusinessEntities.Wellness" table="PersonAddress" lazy="true" dynamic-insert="true" dynamic-update="false"> 
    <id name="PersonAddressId" column="PersonAddressID" type="int"> 
      <generator class="native" /> 
    </id> 
    <version type="binary" generated="always" name="RecordVersion" column="`RecordVersion`" /> 
    <property type="AnsiString" not-null="true" length="1" name="AddressTypeid" column="`AddressTypeID`" /> 
    <property type="AnsiString" not-null="true" length="60" name="AddressLine1" column="`AddressLine1`" /> 
    <property type="AnsiString" length="60" name="AddressLine2" column="`AddressLine2`" /> 
    <property type="AnsiString" length="60" name="City" column="`City`" /> 
    <property type="AnsiString" length="2" name="UsStateId" column="`USStateID`" /> 
    <property type="AnsiString" length="5" name="UsPostalCodeId" column="`USPostalCodeID`" /> 
    <many-to-one name="Person" cascade="none" column="PersonID" /> 
  </class> 
</hibernate-mapping>


        Person newPerson = new Person(); 
        newPerson.PersonName = "John Doe"; 
        newPerson.SSN = "111111111"; 
        newPerson.CreatedBy = "RJC"; 
        newPerson.CreatedDate = DateTime.Today; 
        personDao.AddPerson(newPerson); 
        Person updatePerson = personDao.GetPerson(newPerson.PersonId); 

        updatePerson.PersonAddresses = new List<PersonAddress>(); 
        PersonAddress addr = new PersonAddress(); 
        addr.AddressLine1 = "1 Main St"; 
        addr.City = "Boston"; 
        addr.State = "MA"; 
        addr.Zip = "12345"; 
        updatePerson.PersonAddresses.Add(addr); 
        personDao.UpdatePerson(updatePerson); 
        int addressID = updatePerson.PersonAddresses[0].AddressId; 

尝试:


这是您的C#代码,没有提供映射。请提供您的XML映射文件,以便我们可以帮助您。谢谢您的提示。不幸的是,在更新/添加完成后,updatePerson.PersonalAddresses[0].AddressId=0
    updatePerson.PersonAddresses = new List<PersonAddress>(); 
    PersonAddress addr = new PersonAddress(); 
    addr.AddressLine1 = "1 Main St"; 
    addr.City = "Boston"; 
    addr.State = "MA"; 
    addr.Zip = "12345"; 
    updatePerson.PersonAddresses.Add(addr);
    addr.Person = updatePerson
public void AddAddress(Address addr)
{
    PersonAddresses.Add(addr);
    addr.Person = this;
}