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?

War es hilfreich?

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
    }
  }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top