2010-09-17 9 views
4

Nos entités ont un groupe de propriétés communes. Afin de réduire le mappage répétitif, j'ai créé une classe ClassMap qui mappe les identités et les propriétés communes. Pour ClassMap de chaque entité, je viens de sous-classer la base et cela fonctionne très bien. Pour un nouveau projet, nous laissons également NH générer le schéma DB pour nous. Le problème est que l'ordre des colonnes est tel que les propriétés du ClassMap de base apparaissent en premier, suivies de tout ce qui est mappé dans la sous-classe. L'exigence pour cette construction est que les colonnes apparaissent dans un ordre spécifique.Ordre des classes et des colonnes Nhibernate fluides

Pour contourner cela, j'ai fait ce qui suit.

public class BaseMap<T> : ClassMap<T> where T : Entity 
{ 
    public BaseMap() 
    { 
     Id(x => x.Id); 
     MapEntity(); 
     Map(x => x.CommonProperty1); 
     Map(x => x.CommonProperty2); 
     Map(x => x.CommonProperty3); 
    } 

    protected virtual void MapEntity() 
    { 
    } 
} 

public class SomeEntityMap : BaseMap<SomeEntity> 
{ 
    public SomeEntity() 
    { 
     base.MapEntity(); 
    } 

    protected override void MapEntity() 
    { 
     Map(x => x.SomeEntityProperty1); 
     Map(x => x.SomeEntityProperty2); 
     Map(x => x.SomeEntityProperty3);   
    } 
} 

Cela fonctionne, mais se sent comme un hack. Mis à part le facteur de piratage, y a-t-il quelque chose qui pourrait poser problème?

Répondre

3

Je viens de mettre en œuvre quelque chose de similaire moi-même.

En supposant que vous avez

public class SomeEntity : Entity 
{ 
    ... 
} 

Une façon moins « pirater comme » serait:

public abstract class BaseMap<T> : ClassMap<T> where T : Entity 
{ 
    public BaseMap() 
    { 
     Id(x => x.Id); 
     Map(x => x.CommonProperty1); 
     Map(x => x.CommonProperty2); 
     Map(x => x.CommonProperty3); 
    } 
} 

public class SomeEntityMap : BaseMap<SomeEntity> 
{ 
    public SomeEntity() 
    { 
     Map(x => x.SomeEntityProperty1); 
     Map(x => x.SomeEntityProperty2); 
     Map(x => x.SomeEntityProperty3);   
    } 
} 

Même résultat à la fin, mais vous n'êtes pas en utilisant des méthodes surchargées pour ajouter des applications. Ça va être pris en charge automatiquement.

+0

?? ... SomeEntityMap ne contiendra même pas les propriétés CommonPropertyX, sans parler de l'ordre dont parle l'OP. – Yogesh

+0

Haha. Bon appel Yogesh. SomeEntityMap hérite de ClassMap, alors que cela aurait dû être BaseMap. Avec ce changement, il inclut des propriétés communes. – mimix

+0

+1 C'est correct. Je ne comprends pas non plus pourquoi le PO a utilisé une méthode virtuelle en premier lieu. – Groo

5

Si vous avez fait la méthode la classe de base et carte abstraite il se sentirait moins aki ...

public abstract class BaseMap<T> : ClassMap<T> where T : Entity 
{ 
    public BaseMap() 
    { 
     Id(x => x.Id); 
     MapEntity(); 
     Map(x => x.CommonProperty1); 
     Map(x => x.CommonProperty2); 
     Map(x => x.CommonProperty3); 
    } 

    protected abstract void MapEntity(); 

} 

public class SomeEntityMap : BaseMap<SomeEntity> 
{ 
    protected override void MapEntity() 
    { 
     Map(x => x.SomeEntityProperty1); 
     Map(x => x.SomeEntityProperty2); 
     Map(x => x.SomeEntityProperty3);   
    } 
} 

Cela garderait les colonnes de propriétés communes à la fin de la table. Sachez que les colonnes de clés étrangères seront toujours ajoutées après celles-ci. Je ne pense pas qu'il existe un moyen d'avoir un contrôle complet de l'ordre des colonnes avec aisance, sauf si vous modifiez à la main les scripts de création de schéma.