Почему свободно говорят Nhibernate, игнорируя мою конвенцию?

StackOverflow https://stackoverflow.com/questions/3877932

Вопрос

У меня есть конвенция 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
    }
  }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top