Можете ли вы изменить из базового класса в присоединенный тип подкласса в Nibernate?
-
04-10-2019 - |
Вопрос
У меня есть система сканирования документов, где отсканированы несколько типов документов. Первоначально в документе нет информации, когда его отсканированы, они получают классифицированную, а дополнительная информация вводится для них на втором шаге позже. Итак, у меня есть базовый класс под названием документ и подклассы для каждого типа с их соответствующими метаданными, как ниже. У меня есть его настройки в качестве столового подкласса (соединенного подкласса) отображение в Nibernate.
public class Document
{
public int ID { get; set; }
public string FilePath { get; set; }
}
public class Certificate : Document
{
// certificate-specific fields
}
public class Correspondence : Document
{
// correspondence-specific fields
}
Что мне нужно иметь возможность сделать, это сначала создать класс документа и сохранить его. Затем извлеките на втором шаге позже и преобразуйте его в один из типов подкласса и заполните остальную часть своей информации. Какой был бы лучший подход к этому, и это даже возможно с Nibernate? Если вообще возможно, я хотел бы сохранить оригинальную запись документа, но это не декоратор, если мне придется расслабиться.
Решение
К сожалению, Nibernate не позволяет вам переключаться между подклассами после начального создания; Чтобы получить эту работу так, как вы хотите, у вас есть 3 варианта:
- Используйте собственный вызов SQL, чтобы изменить дискриминатор (и, возможно,) добавить или изменить любые поля, связанные с подкласс.
- Скопируйте содержимое вашего объекта на новый объект правильного класса, а затем удалите оригинал.
- Не используйте подклассы, управляйте состоянием вашего объекта через перечисление или какой-то другой механизм, который позволяет определить их тип во время выполнения.
Другие советы
Эта проблема уже обсуждалась здесь. Отказ Я бы пошел с советом Terry Wilcox, чтобы использовать роль для этого. Состав по наследству.