Tabella per mappatura della gerarchia in un database esistente utilizzando la colonna NHIBERNATE FLUENT SENZA DECIRIMINATOR

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

Domanda

Ho un problema con la tabella per mappatura della gerarchia in un database esistente usando fluente nhibernate (1.2.0.712). Ecco il caso semplificato.

La mia struttura di classe:

Class Diagram

Struttura del database:

Database diagram

Quindi, fondamentalmente, abbiamo 1 tabella (entità) che contiene alcuni dati specifici (ID e nome) + diverse chiavi straniere (per referencedObject1 o referencedObject2).

Abstract Class AbstractTitità contiene ID e nome. Concreteenità1 e concreteenità2 sono classi derivate.

Vorrei mappare queste istanze derivate a seconda dei riferimenti nel database, quindi se esiste un riferimento a referencedObject1 -> è un'istanza di concreteenità1. Se esiste un riferimento a referencedObject2 -> è un'istanza di concretity2.

Qualche codice:

public class AbstractEntity
{
    public virtual Guid Id { get; set; }
    public virtual string Name { get; set; }
}
public class ConcreteEntity1 : AbstractEntity
{
    public virtual ReferencedObject1 ReferencedObject1 { get; set; }
}
public class ConcreteEntity2 : AbstractEntity
{
    public virtual ReferencedObject2 ReferencedObject2 { get; set; }
}


public class AbstractEntityMap : ClassMap<AbstractEntity>
{
    public AbstractEntityMap()
    {
        Table("Entities");
        Id(e => e.Id);
        Map(e => e.Name);
    }
}

Quindi in realtà la mia domanda è come dovrei mappare le lezioni derivate? Ho guardato attraverso Wiki nhibernate fluente e l'ho trovato

Se si desidera fare una strategia di gerarchia da tavolo per classe, allora devi solo specificare la colonna discriminatore nella tua mappa.

Ma, per quanto ho capito, non ho una colonna discriminante. Il mio caso è determinare la sottoclasse in base ai riferimenti chiave estere.

NOTA: per più colonne discriminatori utilizzare un discriminateSubClassSonColumn (""). Formula ([Inserisci SQL personalizzato qui])

Non riesco a trovare un buon esempio di utilizzo della formula. Può essere utile nel mio caso? E sono un po 'confuso, forse sto facendo qualcosa di sbagliato?

Qualcuno può aiutarmi? Grazie in anticipo :)

È stato utile?

Soluzione

DiscriminateSubClassesOnColumn("")
    .Formula(case when ReferencedObject1id > 0 then 1 else case when ReferencedObject2id > 0 then 2 else ... end)

ConcreteEntity1Map()
{
    DiscriminatorValue(1);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top