Почему NHibernate сначала вставляет, а затем обновляет элемент коллекции? - PullRequest
1 голос
/ 08 января 2010

Я не уверен, что это правильное поведение или что-то сделано неправильно на моей стороне:

У меня очень простые отношения родитель-ребенок

public class SubmittedBatch
{
    public virtual Guid Id { get; set; }
    public virtual IList<SubmittedBatchParameter> Parameters { get; private set; }
}

public class SubmittedBatchParameter
{
    public virtual string Value { get; set; }
}

А с FluentNH он настроен так:

mapping.HasMany<SubmittedBatchParameter>(sb => sb.Parameters).Cascade.All();

Я делаю что-то простое, например, добавляю новый элемент в коллекцию Parameters и затем вызываю SaveOrUpdate в родительском элементе.

Глядя на следы операторов SQL, я получаю вставку:

INSERT INTO [SubmittedBatchParameter]
           (Value)
VALUES     ('Disabled' /* @p0 */)
select SCOPE_IDENTITY()

, а затем обновление:

UPDATE [SubmittedBatchParameter]
SET    SubmittedBatch_id = '209971b7-c311-46bd-b989-9cf80113654c' /* @p0_0 */
WHERE  Id = 39 /* @p1_0 */

Почему NH не делает вставку с указанным Guid? Это правильно, или я что-то не так делаю?

Спасибо Simone

1 Ответ

5 голосов
/ 08 января 2010

Вы явно не сопоставили отношения обратного родителя. Поэтому единственный способ, которым NHibernate знает, как сохранить значение столбца SubmittedBatch_id, - это сохранить объект parent . Он не может сохранить оба объекта одновременно, поэтому он сохраняет дочерний элемент, а затем, когда сохраняет родительский объект, сохраняет отношения.

На самом деле, даже если бы вам нужно было отобразить оба направления отношений, вам все равно пришлось бы указывать, кто является «хозяином», помечая другое как «обратное» отношение. Затем поле обновляется путем сохранения главной стороны.

Итак, если вы хотите отобразить свойство SubmittedBatch в классе SubmittedBatchParameter, сопоставьте его как «master» (т. Е. Установите отображение коллекции как обратное, используя .Inverse в Fluent), а затем установите его, когда Вы добавляете параметр в пакет, а затем видите только ожидаемую вставку.

Вот что я имею в виду:

public class SubmittedBatch
{
    public virtual Guid Id { get; set; }
    public virtual IList<SubmittedBatchParameter> Parameters { get; private set; }
}

public class SubmittedBatchParameter
{
    public virtual SubmittedBatch SubmittedBatch { get; set; }
    public virtual string Value { get; set; }
}

Тогда в дочернем отображении:

HasMany<SubmittedBatchParameter>(sb => sb.Parameters).Inverse();

и в родительском отображении:

References(sbp => sbp.SubmittedBatch);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...