2010-12-31 4 views
0

J'ai deux tables similaires (Table1, Table2) donc j'ai créé une classe abstraite de base qui a des propriétés communes. Chaque table a une colonne indiquant l'état du traitement des enregistrements. Je voudrais mapper ces colonnes à une enum:Mappage enum à différentes valeurs

enum RecordStatus 
{ 
    UnkownStatus, 
    NotProcessed, 
    Processed, 
} 

Malheureusement pour chaque table, j'ai besoin de mapper des valeurs différentes pour enums.

J'ai donc créé deux convertisseurs (Table1StatusConverter, Table2StatusConverter) qui héritent de EnumType<RecordStatus> et les installent dans des mappages. Cela fonctionne partiellement. Partiellement parce que NHibernate n'utilise qu'un seul convertisseur dans les deux classes.

Est-ce un bug ou peut-être qu'il fonctionne comme décrit par le design? Y at-il une solution de contournement pour cela?

Edit: j'écrire du code de la mémoire parce que le moment je n'ai pas accès

Entités:

 

class abstract TableBase 
{ 
    public Guid Id { get; protected set; } 
    public string Sender { get; protected set; } 
    public DateTime ReceiveTime { get; protected set; } 
    public RecordStatus Status { get; set; } 
} 

class Table1 : TableBase 
{ 
    public string Message { get; set; } 
} 

class Table2 : TableBase 
{ 
    public ICollection Parts { get; protected set; } 
} 

Convertisseurs: Table1StatusConverter et Table2StatusConverter passer outre la même méthode, mais de différentes manières.

 
class Table1StatusConverter : EnumType<RecordStatus> 
{ 
    public override object GetValue(object enumValue) { ... } 
    public override object GetInstance(object value) { ... } 
} 

Mappages:

 

Table1.hbm.xml 
<class name="Table1" table="Table1"> 
.. 
<property name="Status" type="MyAssembly.Table1StatusConverter, MyAssembly" /> 
.. 
</class> 

Table2.hbm.xml 
<class name="Table2" table="Table2"> 
.. 
<property name="Status" type="MyAssembly.Table2StatusConverter, MyAssembly" /> 
.. 
</class> 


+1

peut-on voir des fichiers de mappage et le code s'il vous plaît? – Rippo

Répondre

1

Cela ne ressemble pas à une bonne utilisation de l'héritage. Toutefois, vous pouvez accomplir cela en mappant la valeur entière pour les énumérations en tant que champ protégé dans la classe de base et utiliser les propriétés publiques dans les classes étendues pour convertir vers et à partir de l'énumération appropriée.

+0

Mais comment demander des articles avec le statut NotProcessed? –

0

Peut-être devez-vous remplacer cette propriété explicitement?


class abstract TableBase 
{ 
    // ... 
    public virtual RecordStatus Status { get; set; } 
} 

class Table1 : TableBase 
{ 
    public string Message { get; set; } 
    public override RecordStatus Status { get; set; } 
} 

class Table2 : TableBase 
{ 
    public ICollection Parts { get; protected set; } 
    public override RecordStatus Status { get; set; } 
}