Можете ли вы перейти с базового класса на объединенный тип подкласса в nhibernate?
У меня есть система сканирования документов, где сканируются несколько типов документов. Первоначально документ не имеет информации при его сканировании, затем они классифицируются, и дополнительная информация вводится для них на втором этапе позже. Итак, у меня есть базовый класс с именем Document и подклассы для каждого типа с соответствующими метаданными, как показано ниже. Я настроил его как отображение таблицы на подкласс (объединенный подкласс) в NHibernate.
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
}
Что мне нужно сделать, это сначала создать класс Document и сохранить его. Затем найдите на втором шаге позже и преобразуйте его в один из типов подкласса и заполните остальную информацию. Каков наилучший подход для этого, и возможно ли это даже с NHibernate? Если это вообще возможно, я хотел бы сохранить первоначальную запись документа, но это не соглашение, если мне придется отказаться от него.
2 ответа
К сожалению, NHibernate не позволяет переключаться между подклассами после первоначального создания; чтобы все заработало так, как вы хотите, у вас есть 3 варианта:
- Используйте собственный вызов sql, чтобы изменить дискриминатор (и, возможно,) добавить или изменить любые поля, связанные с подклассом.
- Скопируйте содержимое вашего объекта в новый объект соответствующего класса, а затем удалите оригинал.
- Не используйте подклассы, управляйте состоянием вашего объекта через перечисление или какой-либо другой механизм, который позволяет вам определять их тип во время выполнения.
Этот вопрос уже обсуждался здесь. Я бы пошел с советами Терри Уилкокса, чтобы использовать роль для этого. Композиция по наследству.