¿Por qué se Fluido NHibernate ignorando mi convención?
-
28-09-2019 - |
Pregunta
Tengo un UserTypeConvention<MyUserType>
convenciones donde MyUserType : IUserType
donde MyUserType
maneja un MyEnum
tipo de enumeración. He configurado Fluido NHibernate thusly
sessionFactory = Fluently
.Configure()
.Database(MsSqlConfiguration.MsSql2005.ConnectionString(
c => c.Is(connectionString))
)
.Mappings(
m => m
.FluentMappings
.AddFromAssemblyOf<A>()
.Conventions
.AddFromAssemblyOf<A>()
)
.BuildSessionFactory();
donde A
es un tipo en el mismo conjunto como UserTypeConvention<MyUserType>
y MyUserType
. Sin embargo, Fluido NHibernate no está aplicando MyUserType
a las propiedades de tipo MyEnum
en mis objetos de dominio. En lugar de ello, se está aplicando FluentNHibernate.Mapping.GenericEnumMapper<MyEnumType>
a estas propiedades.
¿Qué está pasando?
Solución
Por ahora he resuelto esto 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>();
}
}
creo que esto debe estar completamente innecesario. Si alguien me dijo que esto era un error en Fluido NHibernate, que estaría bien. Si alguien me dio una razón buena por qué Fluido NHibernate debe ser tan ansiosos en la aplicación de GenericEnumMapper
que sería aceptable también.
Otros consejos
Ok He intentado lo siguiente y creo que lo hará obras para usted:
simplemente overriede el método Accept en clase MyEnumUserTypeConvention y no hacer nada en su interior:
public class MyEnumUserTypeConvention : UserTypeConvention<MyEnumUserType>
{
public override void Accept(FluentNHibernate.Conventions.AcceptanceCriteria.IAcceptanceCriteria<FluentNHibernate.Conventions.Inspections.IPropertyInspector> criteria)
{
///Do nothing
}
}