Question

J'ai un UserTypeConvention<MyUserType> de convention où MyUserType : IUserType où gère un MyUserType MyEnum de type ENUM. J'ai configuré Fluent NHibernate thusly

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. Cependant, Fluent NHibernate n'applique pas MyUserType aux propriétés de type MyEnum sur mes objets de domaine. Il est plutôt FluentNHibernate.Mapping.GenericEnumMapper<MyEnumType> applique à ces propriétés.

Qu'est-ce qui se passe?

Était-ce utile?

La solution

Pour l'instant j'ai résolu ce 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 tout à fait inutile. Si quelqu'un me dit cela était un bogue 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 trop acceptable.

Autres conseils

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
    }
  }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top