2010-10-07 4 views
3

J'ai une convention UserTypeConvention<MyUserType>MyUserType : IUserTypeMyUserType gère un enum de type MyEnum. J'ai configuré Courant NHibernate thuslyPourquoi Fluent NHibernate ignore-t-il ma convention?

sessionFactory = Fluently 
       .Configure() 
       .Database(MsSqlConfiguration.MsSql2005.ConnectionString(
        c => c.Is(connectionString)) 
       ) 
       .Mappings(
        m => m 
          .FluentMappings 
           .AddFromAssemblyOf<A>() 
          .Conventions 
           .AddFromAssemblyOf<A>() 
       ) 
       .BuildSessionFactory(); 

A est un type dans le même ensemble que UserTypeConvention<MyUserType> et MyUserType. Toutefois, Fluent NHibernate n'applique pas MyUserType aux propriétés de type MyEnum sur mes objets de domaine. Au lieu de cela, il applique FluentNHibernate.Mapping.GenericEnumMapper<MyEnumType> à ces propriétés.

Que se passe-t-il?

+0

Votre convention est-elle touchée si vous la déboguez? Est-ce que c'est public? –

+0

@ James Gregory: Ma convention est 'public'. J'ai remplacé 'UserTypeConvention .Accept' pour voir si elle était appelée. Ce que j'ai appris est qu'il est appelé, mais au moment où mon code atteint ce point, Fluent NHibernate a déjà appliqué 'GenericEnumMapper ' à la propriété en question et donc le critère 'x => x.Type == typeof (MyEnum) 'échoue comme' x.Type' est 'FluentNHibernate.Mapping.GenericEnumMapper '. – jason

+0

@ James Gregory: Voici une petite solution VS 2010 avec un seul test qui échoue réplique le problème: http://j.mp/bu7wQB – jason

Répondre

1

Pour l'instant, j'ai résolu cela avec:

public class MyEnumUserTypeConvention : UserTypeConvention<MyEnumUserType> { 
    public override void Accept(IAcceptanceCriteria<IPropertyInspector> criteria) { 
     // Fluent NHibernate is too eager in applying GenericEnumMapper 
     // so our criteria is that it is already applied this type 
     criteria.Expect(x => x.Type == typeof(GenericEnumMapper<MyEnum>)); 
    } 

    public override void Apply(IPropertyInstance instance) { 
     // we override Fluent NHibernate's application of GenericEnumMapper 
     instance.CustomType<MyEnumUserType>(); 
    } 
} 

Je pense que cela devrait être complètement inutile. Si quelqu'un m'a dit que c'était un bug dans Fluent NHibernate, ce serait bien. Si quelqu'un m'a donné une bonne raison pour laquelle Fluent NHibernate devrait être si désireux d'appliquer GenericEnumMapper qui serait acceptable aussi.

0

Ok j'ai essayé ce qui suit et je pense qu'il fonctionne pour vous:
juste overriede la méthode Accepter en classe MyEnumUserTypeConvention et ne rien faire à l'intérieur:

public class MyEnumUserTypeConvention : UserTypeConvention<MyEnumUserType> 
    { 
    public override void Accept(FluentNHibernate.Conventions.AcceptanceCriteria.IAcceptanceCriteria<FluentNHibernate.Conventions.Inspections.IPropertyInspector> criteria) 
    { 
     ///Do nothing 
    } 
    } 
+0

Cela n'a pas fonctionné, mon test échoue toujours. Le point est ce travail _should_ sans avoir à redéfinir quoi que ce soit dans 'UserTypeConvention'. – jason

+0

votre test échoue parce que vous vérifiez que propertyType (status) doit être égal à MyEnumUserType, mais si vous avez vérifié manuellement le type de propertyType, vous voyez qu'il est de type Nhibernate CustomType et son nom est 'MyEnumUserType', et je pense que devrait être. –

+0

D'accord, c'est bien. Vous avez raison à ce sujet. Mais mon point que cela devrait fonctionner sans avoir à surcharger 'UserTypeConvention.Accept' reste encore. – jason