Отключить возможность обновления подклассов

Я разрабатываю стратегию наследования в свободное владение. Все работает правильно, но у меня есть один вопрос. Есть ли возможность отключить обновление базового свойства через подкласс?

Вот фиктивный код:

public class ObjectA
{
    public virtual string StatusA { get; set; }
}

public class ObjectB : ObjectA
{
    public virtual string StatusB { get; set; }
}

public class ObjectBMap : SubclassMap<ObjectB>
{
    public ObjectBMap()
    {
        Map(x => x.StatusB);
    }
}

Когда я обновляю objectB, я не хочу обновлять StatusA. Я хочу изменить статус A, когда я буду обновлять ObjectA. Есть ли в nhibernate такая функция? Есть ли в этом смысл?

Редактировать: Дополнительное объяснение Причина, по которой я хочу сделать это, состоит в том, что в моей системе (приложение asp mvc) у нас есть два разных места, где мы управляем объектами A и объектами B. Сначала мы создаем объект A, а затем мы хотим "преобразовать" объект A в objectB. Затем мы можем редактировать эти два объекта в двух разных модулях.

Мой поток для редактирования объекта B: -Чтение объекта B из базы данных, преобразование его в viewmodel -Пост формы из представления, преобразование данных представления из формы в objectB и обновление в базе данных.

Я не хочу расширять модель представления для объекта B для данных из объекта A, сохранять эти данные в некоторых скрытых полях и конвертировать из модели представления.

Я подумал, что если можно будет отметить, что эти данные не могут быть обновлены с помощью Session.SaveorUpdate(objectB), это решит мои проблемы. Так что в основном это был мой вопрос.

1 ответ

Попробуйте проверить документацию:

Небольшая ссылка:

<class
    name="ClassName"                              (1)
    table="tableName"                             (2)
    ...
    dynamic-update="true|false"                   (7)
    dynamic-insert="true|false"                   (8)
    ...

...
(7) dynamic-update (необязательно, по умолчанию false): указывает, что SQL UPDATE должен генерироваться во время выполнения и содержать только те столбцы, значения которых изменились.
(8) dynamic-insert (необязательно, по умолчанию false). Указывает, что INSERT SQL должен генерироваться во время выполнения и содержать только столбцы, значения которых не равны NULL.

Что мы можем видеть, это настройка "dynamic-update"... что делает то, что мы ожидали: обновлять только те свойства, которые были изменены

Это был бы самый родной способ научить NHibernate выпускать обновления только для ObjectB ... если нет изменений в определенных свойствах ObjectA.

Но в целом: просто оставьте это NHibernate. То, что он делает, скорее всего, будет лучшим из того, что нам нужно... это зрелый инструмент

ПРОДЛИТЕ

Исходя из вопроса расширения - я бы сказал: не идите по этому пути... Не надо.

С инструментами ORM вы получите много, если ваша модель, модель бизнес-сферы, будет оставаться настолько простой, насколько это возможно. NHibernate может помочь с большим количеством вещей, например:

  • выбор всех или только некоторых свойств - так называемые проекции
  • пейджинг
  • сортировка
  • фильтрация
  • каскадирование операций WRITE
  • и даже больше...

Но это не поможет вам управлять "неожиданным" или "исключительным" дизайном модели предметной области.

Пожалуйста прочтите это:

Композиция над наследованием (или принципом составного повторного использования) в объектно-ориентированном программировании - это метод, с помощью которого классы могут достичь полиморфного поведения и повторного использования кода, содержая другие классы, которые реализуют желаемую функциональность, а не посредством наследования...

Другие вопросы по тегам