Почему NHibernate выполняет вставку вместо обновления? - PullRequest
1 голос
/ 06 июля 2010

У меня есть следующее сопоставление:

<!-- WidgetConfiguration -->
<class name="MyProject.WidgetConfiguration, MyProject" table="WidgetConfigurations">
  <id name="Id" column="Id" type="Int64">
    <generator class="native" />
  </id>

  <property name="Name" column="ConfigurationName" />

  <map name="Widgets" table="WidgetConfigurationPositions" cascade="all" lazy="false" fetch="select" inverse="true">
    <key column="WidgetConfigurationId" />
    <index column="TargetId" type="string" />
    <one-to-many class="MyProject.WidgetPlacement" />
  </map>
</class>
<!-- End WidgetConfiguration -->

<class name="MyProject.WidgetPlacement, MyProject" table="WidgetConfigurationPositions">
  <id name="Id" column="Id" type="Int64">
    <generator class="native" />
  </id>

  <many-to-one name="Widget" class="MyProject.Widget, MyProject" column="WidgetId" lazy="false" />
  <property name="Target" column="TargetId" not-null="true" />

  <map name="Options" table="PlacedWidgetOptions" cascade="all" lazy="false" fetch="select">
    <key column="WidgetConfigurationPositionId"/>
    <index column="OptionName" type="string" />
    <element column="OptionValue" type="string" />
  </map>
</class>

И у меня есть следующий бит кода:

public override void Update(WidgetConfiguration obj)
{
 using (var session = GetSession())
 {
  var tx = session.BeginTransaction();
  session.Update(obj);
  tx.Commit();

  //session.Evict(obj);
 }
}

Я могу сохранить WidgetConfiguration просто денди, но пытаюсь обновитьWidgetConfiguration, NHibernate фактически выполняет вставку!Вот сессия от моего NHibernate Profiler.

begin transaction with isolation level: Unspecified

INSERT INTO WidgetConfigurations
           (ConfigurationName)
VALUES     ('dashboard' /* @p0 */)
select SCOPE_IDENTITY()

INSERT INTO WidgetConfigurationPositions
           (WidgetId,
            TargetId)
VALUES     (1 /* @p0 */,
            'row1-column1' /* @p1 */)
select SCOPE_IDENTITY()

UPDATE WidgetConfigurationPositions
SET    WidgetId = 1 /* @p0 */,
       TargetId = 'row1-column2' /* @p1 */
WHERE  Id = 356 /* @p2 */

commit transaction

У меня есть нет идея, почему это происходит, и Google не очень помогает.У кого-нибудь есть идеи?

Ответы [ 3 ]

3 голосов
/ 06 июля 2010

Попробуйте установить атрибут unsaved-value:

<id name="Id" column="Id" type="Int64" unsaved-value="0">
    <generator class="native" />
</id>

Какой тип столбца идентификатора?Если это долго?тогда несохраненное значение должно быть null.Вам не нужно устанавливать это, но это первое, что я бы попробовал.

2 голосов
/ 06 июля 2010

Не забыли ли вы переопределить ваши Equals () и GetHashCode ()?Поскольку вы отсоединяетесь, а затем снова присоединяете, эти методы вступят в игру.

Я бы порекомендовал взять NHibernate In Action и прочитать о жизненном цикле постоянства:)

0 голосов
/ 06 июля 2010

My думаю, заключается в том, что ваша проблема вызвана извлечением объекта в одном сеансе NH и обновлением его в другом.

Либо оставляйте сеанс NH открытым в течение всего запроса, либо попробуйте прикрепить (Lock ()?) Объект к обновляющему сеансу NH.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...