سؤال

لدي مؤتمر UserTypeConvention<MyUserType> أين MyUserType : IUserType أين MyUserType يتعامل مع نوع التعداد MyEnum. لقد قمت بتكوين nhibernate بطلاقة وبالتالي

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 بطلاقة ، فسيكون ذلك جيدًا. إذا أعطاني أحدهم سببًا جيدًا لوجود Nhibernate بطلاقة يجب أن يكون حريصًا جدًا في التقديم 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