Pourquoi est-Fluent NHibernate ma convention tient pas compte?
-
28-09-2019 - |
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();
où 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?
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
}
}