#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.