Можете ли вы изменить из базового класса в присоединенный тип подкласса в Nibernate?

StackOverflow https://stackoverflow.com/questions/3755148

Вопрос

У меня есть система сканирования документов, где отсканированы несколько типов документов. Первоначально в документе нет информации, когда его отсканированы, они получают классифицированную, а дополнительная информация вводится для них на втором шаге позже. Итак, у меня есть базовый класс под названием документ и подклассы для каждого типа с их соответствующими метаданными, как ниже. У меня есть его настройки в качестве столового подкласса (соединенного подкласса) отображение в 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 варианта:

  1. Используйте собственный вызов SQL, чтобы изменить дискриминатор (и, возможно,) добавить или изменить любые поля, связанные с подкласс.
  2. Скопируйте содержимое вашего объекта на новый объект правильного класса, а затем удалите оригинал.
  3. Не используйте подклассы, управляйте состоянием вашего объекта через перечисление или какой-то другой механизм, который позволяет определить их тип во время выполнения.

Другие советы

Эта проблема уже обсуждалась здесь. Отказ Я бы пошел с советом Terry Wilcox, чтобы использовать роль для этого. Состав по наследству.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top