Обновление дочернего свойства Nhibernate ведет себя странно!

#wcf #nhibernate #ienumerable #parent-child

#wcf #nhibernate #ienumerable #родитель-потомок

Вопрос:

Это настройка моего приложения: веб-клиент <-> Служба WCF <-> Репозитории домена <-> NHibernate <-> База данных

Все проекты используют одни и те же объекты домена через «общие библиотеки DLL».

Одна из сущностей (атрибут) получила коллекцию дочерних сущностей (опция). Отображение выглядит следующим образом:

 // Attribute mapping
<class name="Attribute" lazy="false" table="Attributes">

    <id name="Id" column="AttributeId" type="System.Int32" unsaved-value="0">
        <generator class="native"/>
    </id>

    <property name="Name" type="System.String" length="100" not-null="true" />

    <bag name="Options" generic="true" lazy="false" cascade="all-delete-orphan">
        <key column="AttributeId" foreign-key="AttributeId" />
        <one-to-many class="AttributeOption" not-found="ignore" />
    </bag>

</class>

// Attribute option mapping, which is a child of Attribute
<class name="AttributeOption" lazy="false" table="AttributeOptions">

   <id name="Id" column="OptionId" type="System.Int32" unsaved-value="0">
        <generator class="native" />
   </id>

   <property name="AttributeId" type="System.Int32" not-null="true" />
   <property name="Name" type="System.String" length="100" not-null="true" insert="true" update="true" />
   <property name="Order" column="OrderVal" type="System.Int32" not-null="true" insert="true" update="true"  />

</class>
  

Кажется, все работает нормально, за исключением попыток обновить одно из свойств ОПЦИИ.

Чтобы быть более точным; Значение обновляется каждый раз, когда я нахожусь в режиме отладки Visual Studio, и вручную нажимаю «Развернуть результат» в IEnumerable, возвращаемом из следующей строки кода:

 var attrib = tempAttribute.Options.Where(e => e.Id == parsedId).Select(e => e.Name = model.EditRequest.Name);
  

Однако, если я не выполняю «развернуть результат» вручную (как я сделал на изображении ниже), похоже, что это также не обновляет базу данных.

занятый кот http://i54.tinypic.com/311ungn.gif

Как это вообще возможно? Для меня это не имеет особого смысла..

Любая помощь или теории очень ценятся! 🙂

Большое спасибо!

Ответ №1:

Причина в том, что attrib фактически не содержит список элементов. Оно содержит итератор. Таким образом, часть выбора не выполняется автоматически, если вы не перечислите атрибут. Именно это вы и делаете, когда разворачиваете результаты. Я бы предложил вручную выполнить настройку, чтобы было намного более очевидно, что происходит, или рассмотреть возможность использования такого инструмента, как Automapper или ValueInjecter.

Комментарии:

1. Спасибо за ваш ответ, Вадим! Что вы подразумеваете под выполнением настройки вручную? Я сам написал сопоставление с помощью файла XML-схемы NHibernate для Visual Studio.

2. @MikalBen, я имею в виду вместо того, чтобы использовать Select метод расширения и явно выполнять настройку свойства Name.