NHibernate - новый элемент добавлен в коллекцию не сохраняется - PullRequest
1 голос
/ 21 сентября 2009

У меня есть таблица клиентов с отношениями «один ко многим» с контактными лицами. Я сопоставил два класса для NHibernate как

В классе клиента

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

Я установил insert = "false" update = "false" для ClientId (внешний ключ в ContactPerson), чтобы запретить NHibernate создавать дополнительный столбец в операторе вставки.

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

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

Я также устанавливаю объекты «Свойство клиента контактного лица» в наборе в установщик выполняемой коллекции.

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

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

1 Ответ

0 голосов
/ 21 сентября 2009

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

...