4 votes

Fluent Nhibernate ClassMaps et ordre des colonnes

Nos entités ont un groupe de propriétés communes. Afin de réduire le mappage répétitif, j'ai créé une ClassMap de base qui mappe les identités et les propriétés communes. Pour chaque ClassMap d'entité, j'ai simplement sous-classé la base et cela fonctionne parfaitement. Pour un nouveau projet, nous laissons également NH générer le schéma de la base de données pour nous. Le problème est que l'ordre des colonnes est tel que les propriétés de la ClassMap de base apparaissent en premier, suivies de tout ce qui est mappé dans la sous-classe. L'exigence pour ce build est que les colonnes apparaissent dans un ordre spécifique.

Pour contourner ce problème, 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 ressemble à un piratage. Mis à part le facteur "piratage", y a-t-il quelque chose ici qui pourrait être problématique ?

5voto

dotjoe Points 11959

Si vous rendiez la classe de base et la méthode map abstraites, cela serait moins compliqué...

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 permettrait de conserver les colonnes de biens communs à la fin du tableau. Sachez que les colonnes de clés étrangères seront toujours ajoutées après celles-ci. Je ne pense pas qu'il y ait un moyen d'avoir un contrôle total de l'ordre des colonnes avec fluent, à moins de modifier manuellement le schéma de création scripts.

3voto

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

En supposant que vous avez

public class SomeEntity : Entity
{ 
    ...
}

Un moyen moins "pirate" serait de le faire :

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 au final, mais vous n'utilisez pas de méthodes surchargées pour ajouter des mappings. Cela sera pris en charge automatiquement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X