Fluent NHibernate ed eredità per sottoclasse
-
27-10-2019 - |
Domanda
Ho una classe base e due Childs (A: Base e B: Base), e voglio mapparli a due tabelle (tabelle A e B). Che è possibile in Fluent NHibernate? Così ho:
public class Base
{
public virtual int Id {get;set;}
public virtual int IndexIn {get;set;}
public virtual Product Product {get;set;}
}
public class A : Base
{
public virtual string Value {get;set;}
}
public class B : Base
{
public virtual int Value {get;set;}
public virtual IList<Sequence> Sequences {get;set;}
}
La mia mappatura è:
public class BaseMap : ClassMap<Base>
{
public BaseMap()
{
Id(x => x.Id);
Map(x => x.IndexIn);
References(x => x.Product);
}
}
public class AMap : SubclassMap<A>
{
public AMap()
{
Map(x => x.Value);
}
}
public class BMap : SubclassMap<B>
{
public BMap()
{
Map(x => x.Value);
HasMany(x => x.Sequences);
}
}
Ma in questo caso si crea tre tabelle (A, B e Base). Che bello, ma ho bisogno di ridurre il numero di tavoli, quindi sono ok per avere i campi di base sia in A e tabella B. In generale voglio mappare semplicemente A e B come classi normali (senza usare l'ereditarietà), ma ho bisogno di essere in grado di aggiungere qualche altra classe, dove posso avere la proprietà:
public virtual IList<Base> ListofAandB {get;set;}
Se rimuovo definizione mappa di base e appena traccio A e B come ClassMap <> ricevo l'errore "Impossibile trovare mappa definizione per Base" se cerco di utilizzare la proprietà che è scritto sopra.
Soluzione
Non sarà in grado di mappare la vostra proprietà ListOfAAndB
se la vostra eredità è presente solo nel codice e non nel vostro modello di database. Per avere NHibernate Visualizza la proprietà come si definisce, si sta andando ad avere bisogno di un tavolo Base
nel database.