Perché Fluent NHibernate ignorando la mia convention?
-
28-09-2019 - |
Domanda
Ho un UserTypeConvention<MyUserType>
congressi dove MyUserType : IUserType
dove MyUserType
gestisce un tipo enum MyEnum
. Ho configurato Fluent NHibernate questa convenzione
sessionFactory = Fluently
.Configure()
.Database(MsSqlConfiguration.MsSql2005.ConnectionString(
c => c.Is(connectionString))
)
.Mappings(
m => m
.FluentMappings
.AddFromAssemblyOf<A>()
.Conventions
.AddFromAssemblyOf<A>()
)
.BuildSessionFactory();
dove A
è un tipo nello stesso assieme come UserTypeConvention<MyUserType>
e MyUserType
. Tuttavia, Fluent NHibernate non applica MyUserType
di proprietà di tipo MyEnum
sui miei oggetti di dominio. Invece, sta applicando FluentNHibernate.Mapping.GenericEnumMapper<MyEnumType>
a queste proprietà.
Che cosa sta succedendo?
Soluzione
Per ora ho risolto questo con:
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>();
}
}
Credo che questo dovrebbe essere completamente inutile. Se qualcuno mi ha detto che questo fosse un bug in Fluent NHibernate, che sarebbe stato bene. Se qualcuno mi ha dato una buona ragione per cui Fluent NHibernate dovrebbe essere così ansiosi nell'applicazione GenericEnumMapper
che sarebbe troppo accettabile.
Altri suggerimenti
Ok ho provato quanto segue e penso che lo farà funziona per voi:
basta overriede il metodo della classe MyEnumUserTypeConvention Accetta e non fare nulla al suo interno:
public class MyEnumUserTypeConvention : UserTypeConvention<MyEnumUserType>
{
public override void Accept(FluentNHibernate.Conventions.AcceptanceCriteria.IAcceptanceCriteria<FluentNHibernate.Conventions.Inspections.IPropertyInspector> criteria)
{
///Do nothing
}
}