Domanda

Ho un UserTypeConvention<MyUserType> congressi dove MyUserType : IUserType dove MyUserType gestisce un tipo enum MyEnum. Ho configurato Fluent NHibernate questa convenzione

sessionFactory = Fluently
                .Configure()
                .Database(MsSqlConfiguration.MsSql2005.ConnectionString(
                    c => c.Is(connectionString))
                )
                .Mappings(
                    m => m
                            .FluentMappings
                                .AddFromAssemblyOf<A>()
                            .Conventions
                                .AddFromAssemblyOf<A>()
                )
                .BuildSessionFactory();

dove A è un tipo nello stesso assieme come UserTypeConvention<MyUserType> e MyUserType. Tuttavia, Fluent NHibernate non applica MyUserType di proprietà di tipo MyEnum sui miei oggetti di dominio. Invece, sta applicando FluentNHibernate.Mapping.GenericEnumMapper<MyEnumType> a queste proprietà.

Che cosa sta succedendo?

È stato utile?

Soluzione

Per ora ho risolto questo 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>();
    }
}

Credo che questo dovrebbe essere completamente inutile. Se qualcuno mi ha detto che questo fosse un bug in Fluent NHibernate, che sarebbe stato bene. Se qualcuno mi ha dato una buona ragione per cui Fluent NHibernate dovrebbe essere così ansiosi nell'applicazione GenericEnumMapper che sarebbe troppo accettabile.

Altri suggerimenti

Ok ho provato quanto segue e penso che lo farà funziona per voi:
basta overriede il metodo della classe MyEnumUserTypeConvention Accetta e non fare nulla al suo interno:

  public class MyEnumUserTypeConvention : UserTypeConvention<MyEnumUserType>
  {
    public override void Accept(FluentNHibernate.Conventions.AcceptanceCriteria.IAcceptanceCriteria<FluentNHibernate.Conventions.Inspections.IPropertyInspector> criteria)
    {
       ///Do nothing
    }
  }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top