Почему свободно говорят Nhibernate, игнорируя мою конвенцию?
-
28-09-2019 - |
Вопрос
У меня есть конвенция UserTypeConvention<MyUserType>
куда MyUserType : IUserType
куда MyUserType
обрабатывает тип enum MyEnum
. Отказ Я настроил беглый Nibernate
sessionFactory = Fluently
.Configure()
.Database(MsSqlConfiguration.MsSql2005.ConnectionString(
c => c.Is(connectionString))
)
.Mappings(
m => m
.FluentMappings
.AddFromAssemblyOf<A>()
.Conventions
.AddFromAssemblyOf<A>()
)
.BuildSessionFactory();
куда A
это тип в той же сборке, что и UserTypeConvention<MyUserType>
а также MyUserType
. Отказ Тем не менее, беглый Nhibernate не применяется MyUserType
к свойствам типа MyEnum
на моих доменных объектах. Вместо этого это применяется FluentNHibernate.Mapping.GenericEnumMapper<MyEnumType>
к этим свойствам.
Что здесь происходит?
Решение
На данный момент я решил это с:
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>();
}
}
Я думаю, что это должно быть тщательно ненужно. Если кто-то сказал мне, что это был ошибка в свободном случае Nhibernate, что будет хорошо. Если кто-то дал мне вескую причину, почему свободно, Nibernate, должно быть так жаждут применения GenericEnumMapper
Это тоже было бы приемлемо.
Другие советы
Хорошо, я попробовал следующее, и я думаю, что это будет работать для вас:
Просто перевернул метод приема в классе MyenumusertyPeconvention и ничего не делай внутри него:
public class MyEnumUserTypeConvention : UserTypeConvention<MyEnumUserType>
{
public override void Accept(FluentNHibernate.Conventions.AcceptanceCriteria.IAcceptanceCriteria<FluentNHibernate.Conventions.Inspections.IPropertyInspector> criteria)
{
///Do nothing
}
}