为什么Fluent NHibernate无视我的惯例?

时间:2010-10-07 00:42:49

标签: nhibernate fluent-nhibernate enums iusertype

我有一个约定UserTypeConvention<MyUserType>MyUserType : IUserType其中MyUserType处理枚举类型MyEnum。我已经配置了Fluent 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相同的程序集中的类型。但是,Fluent NHibernate没有将MyUserType应用于我的域对象上的MyEnum类型的属性。相反,它正在将FluentNHibernate.Mapping.GenericEnumMapper<MyEnumType>应用于这些属性。

发生了什么事?

2 个答案:

答案 0 :(得分:1)

现在我用以下方法解决了这个问题:

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>();
    }
}

我认为这应该是完全没必要的。如果有人告诉我这是Fluent NHibernate的一个错误,那就没事了。如果有人给了我一个很好的理由,为什么Fluent NHibernate应该如此渴望应用GenericEnumMapper,这也是可以接受的。

答案 1 :(得分:0)

好的我尝试了以下内容,我认为它适合您: 只需覆盖MyEnum UserType Convention类中的Accept方法,并在其中不执行任何操作:

  public class MyEnumUserTypeConvention : UserTypeConvention<MyEnumUserType>
  {
    public override void Accept(FluentNHibernate.Conventions.AcceptanceCriteria.IAcceptanceCriteria<FluentNHibernate.Conventions.Inspections.IPropertyInspector> criteria)
    {
       ///Do nothing
    }
  }