Отключить возможность обновления подклассов
Я разрабатываю стратегию наследования в свободное владение. Все работает правильно, но у меня есть один вопрос. Есть ли возможность отключить обновление базового свойства через подкласс?
Вот фиктивный код:
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
- и даже больше...
Но это не поможет вам управлять "неожиданным" или "исключительным" дизайном модели предметной области.
Пожалуйста прочтите это:
Композиция над наследованием (или принципом составного повторного использования) в объектно-ориентированном программировании - это метод, с помощью которого классы могут достичь полиморфного поведения и повторного использования кода, содержая другие классы, которые реализуют желаемую функциональность, а не посредством наследования...