Si può passare da una classe base a un tipo sottoclasse uniti in NHibernate?
-
04-10-2019 - |
Domanda
Ho sistema di scansione del documento in cui vengono esaminati diversi tipi di documenti. Inizialmente, il documento non ha informazioni quando la sua scansione, poi ottengono classificati e informazioni aggiuntive vengono inseriti per loro in una seconda fase successiva. Così, ho una classe di base denominata Documento, e sottoclassi per ogni tipo con i rispettivi metadati come qui di seguito. Ce l'ho messa a punto come una mappatura tabella per sottoclasse (sottoclasse uniti) in 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
}
Quello che ho bisogno di essere in grado di fare è creare una classe primo documento e salvarlo. Quindi recuperare in una seconda fase più tardi e convertirlo in uno dei tipi di sottoclasse e compilare il resto delle sue informazioni. Quale sarebbe il metodo migliore per fare questo, ed è questo anche possibile con NHibernate? Se possibile vorrei mantenere il record di documento originale, ma non è un grosso problema, almeno se devo getto esso.
Soluzione
Purtroppo, NHibernate non consente di passare tra le sottoclassi dopo la creazione iniziale; per ottenere questo lavoro nel modo desiderato, si hanno 3 opzioni:
- Utilizza una chiamata SQL nativo per modificare il discriminatore (e possibilmente) aggiungere o modificare i campi sottoclasse-correlato.
- Copiare il contenuto del vostro oggetto ad un nuovo oggetto della classe corretta e quindi eliminare l'originale.
- Non utilizzare sottoclassi, controllare lo stato del vostro oggetto attraverso un'enumerazione o qualche altro meccanismo che consente di determinare il loro tipo in fase di esecuzione.
Altri suggerimenti
Il problema è già stato discusso qui . Vorrei andare con la punta di Terry Wilcox di utilizzare un ruolo per questo. Composizione per l'eredità.