У меня есть таблица для клиентов с отношением «один ко многим» с контактными лицами. Я сопоставляются два класса для 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;
}
}
}
Я пробовал все в сообщениях, с которыми я столкнулся в Интернете. Теперь разочарование в этом. Может ли кто-нибудь помочь?
Почему downvote? Похоже на разумное предложение. –
:) такой же вопрос здесь! – Beatles1692
Я не использую общий список. Проверьте код в моем сообщении, он использует ISet –
Protean