Warum ignoriert Fluent NHibernate meine Konvention?
-
28-09-2019 - |
Frage
Ich habe eine Konvention UserTypeConvention<MyUserType>
wo MyUserType : IUserType
wo MyUserType
eine MyEnum
Aufzählungstyp behandelt. Ich habe konfiguriert Fluent NHibernate thusly
sessionFactory = Fluently
.Configure()
.Database(MsSqlConfiguration.MsSql2005.ConnectionString(
c => c.Is(connectionString))
)
.Mappings(
m => m
.FluentMappings
.AddFromAssemblyOf<A>()
.Conventions
.AddFromAssemblyOf<A>()
)
.BuildSessionFactory();
Dabei gilt A
eine Art in derselben Anordnung wie UserTypeConvention<MyUserType>
und MyUserType
ist. Allerdings ist Fluent NHibernate nicht MyUserType
zu Eigenschaften von Typ MyEnum
auf meinen Domain-Objekten anwenden. Stattdessen wird es FluentNHibernate.Mapping.GenericEnumMapper<MyEnumType>
diese Eigenschaften anwenden.
Was ist da los?
Lösung
So habe ich nun gelöst dies mit:
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>();
}
}
Ich denke, das durchaus nicht notwendig sein sollte. Wenn mir jemand gesagt, war dies ein Fehler in Fluent NHibernate, die in Ordnung sein würden. Wenn jemand gab mir einen guten Grund, warum Fluent NHibernate so eifrig sein sollte GenericEnumMapper
bei der Anwendung, die zu akzeptabel wäre.
Andere Tipps
Ok habe ich versucht, die folgende und ich denke, es wird für Sie arbeitet:
nur overriede Accept-Methode in MyEnumUserTypeConvention Klasse und nichts tun, im Innern:
public class MyEnumUserTypeConvention : UserTypeConvention<MyEnumUserType>
{
public override void Accept(FluentNHibernate.Conventions.AcceptanceCriteria.IAcceptanceCriteria<FluentNHibernate.Conventions.Inspections.IPropertyInspector> criteria)
{
///Do nothing
}
}