2009-09-21 6 views
1

У меня есть таблица для клиентов с отношением «один ко многим» с контактными лицами. Я сопоставляются два класса для NHibernate, какNHibernate - новый элемент, добавленный в коллекцию, не сохраняется

В Client класса

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
assembly="MyAssembly.Core" 
namespace="MyAssembly.Core.Domain" 
> 
<class name="Client" table="CompanyXClients"> 
<id name="ClientId" column="ClientId" unsaved-value="0"> 
<generator class="identity" /> 
</id> 
<property name="CompanyId" column="CompanyId" type="Int32" length="8" /> 
<property name="ClientName" column="ClientName" type="String" length="100" /> 
<property name="Address1" column="Address1" type="String" length="255" /> 
<property name="Address2" column="Address2" type="String" length="255" /> 
<property name="City" column="City" type="String" length="50" /> 
<property name="State" column="State" type="String" length="50" /> 
<property name="CountryCode" column="CountryCode" type="String" length="2" /> 
<property name="Zip" column="Zip" type="String" length="7" /> 
<property name="Phone" column="Phone" type="String" length="20" /> 
<property name="Fax" column="Fax" type="String" length="20" /> 
<property name="EmailAddress" column="EmailAddress" type="String" length="255" /> 
<property name="PayPalId" column="PayPalId" type="String" length="255" /> 
<property name="Notes" column="Notes" type="String" length="255" /> 
<property name="TimeZone" column="TimeZone" type="Decimal" /> 
<set name="ContactPersons" lazy="true" cascade="all"> 
<key column="ClientId" not-null="true"/> 
<one-to-many class="ContactPerson"/> 
</set> 
</class> 

</hibernate-mapping> 

В ContactPerson класса

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
assembly="MyAssembly.Core" 
namespace="MyAssembly.Core.Domain" 
> 
<class name="ContactPerson" table="ClientXContactPersons"> 
<id name="ContactPersonId" column="ContactPersonId" unsaved-value="0" type="Int64"> 
<generator class="identity" /> 
</id> 
<property name="ClientId" column="ClientId" type="Int64" length="8" insert="false" update="false" /> 
<property name="FirstName" column="FirstName" type="String" length="50" /> 
<property name="LastName" column="LastName" type="String" length="50" /> 
<property name="Designation" column="Designation" type="String" length="50" /> 
<property name="Mobile" column="Mobile" type="String" length="20" /> 
<property name="Phone" column="Phone" type="String" length="20" /> 
<property name="EmailAddress" column="EmailAddress" type="String" length="255" /> 
<property name="IsDefault" column="IsDefault" type="Boolean" /> 
<many-to-one name="Client" column="ClientId" not-null="true"/> 
</class> 

</hibernate-mapping> 

Я использую Виндзорский замок для NHibernate. Вот код для сохранения клиента.

IClientDAO oClientDao = Factory.GetClientDAO(); 
Client oClient = null; 
if (Form[this.ControlPrefix + "." + "ClientId"] != "0") 
{ 
    oClient = oClientDao.GetById(long.Parse(Form["ClientId"]),true); 
} 
else 
{ 
    oClient = new Client(); 
} 
this.UpdateModel(oClient,"SomePrefix",Form.ToValueProvider()); 
oClient.CompanyId = AuthUser.CompanyId; 
oClientDao.SaveOrUpdate(oClient); 

Я установил вставку = «ложное» обновление = «ложь» для ClientId (Внешний ключ в ContactPerson), чтобы остановить NHibernate генерирования дополнительного столбца в Вставках Заявления.

Проблема заключается в том, что модель обновляется правильно с FormCollection. Если я добавлю нового клиента, контактные лица также будут сохраняться, когда я обновляю клиент, а каскадирование - отлично. Но, если я редактирую существующий клиент, он загружает существующих контактных лиц, обновляет данные из FormCollection. Но обновление клиента не каскадирует и не выполняет обновление контактных лиц. Таким образом, новые контактные лица никогда не сохраняются, и даже изменения данных существующего контактного лица не сохраняются.

Если вставка одобрена и становится каскадом для контактов, когда я обновляю клиент. Какова должна быть проблема с обновлением?

Я также устанавливаю объекты Client Property объектов Contact Person в коллекции в сеттере коллекции, которая выполняется.

public virtual ISet<ContactPerson> ContactPersons 
{ 
    get { return _ContactPersons; } 
     set 
     { 
      _ContactPersons = value; 
      foreach (ContactPerson oPerson in _ContactPersons) 
      { 
       oPerson.Client = this; 
       oPerson.ClientId = this.ClientId; 
      } 
     } 
    } 

Я пробовал все в сообщениях, с которыми я столкнулся в Интернете. Теперь разочарование в этом. Может ли кто-нибудь помочь?

ответ

-1

Я не уверен, что это проблема, но у нас была аналогичная проблема, и мы выяснили, что всякий раз, когда мы использовали общую коллекцию IList, каскадный механизм не работал. Таким образом, мы использовали не общие коллекции

+0

Почему downvote? Похоже на разумное предложение. –

+0

:) такой же вопрос здесь! – Beatles1692

+0

Я не использую общий список. Проверьте код в моем сообщении, он использует ISet Protean

Смежные вопросы