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?

¿Fue útil?

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
    }
  }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top