Обновление дочернего свойства Nhibernate ведет себя странно! - PullRequest
0 голосов
/ 13 июня 2011

Это настройки моего приложения: Веб-клиент <-> Служба 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>

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

Чтобы быть более точным; Значение IS обновляется каждый раз, когда я нахожусь в режиме отладки 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 Ответ

1 голос
/ 13 июня 2011

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

...