2010-10-07 50 views
3

我有一个约定UserTypeConvention<MyUserType>其中MyUserType : IUserType其中MyUserType处理枚举类型MyEnum。我已经配置功能NHibernate正是如此为什么流利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>应用于这些属性。

这是怎么回事?

+0

如果你调试它,你的惯例会被击中吗?它是“公共”吗? – 2010-10-07 11:45:47

+0

@詹姆斯格雷戈里:我的约定是'公开'。我覆盖'UserTypeConvention 。接受'看它是否被调用。我学到的是它被调用,但是当我的代码达到那个时候,Fluent NHibernate已经将'GenericEnumMapper '应用于所讨论的属性,因此标准'x => x.Type == typeof(MyEnum )''失败,因为'x.Type'是'FluentNHibernate.Mapping.GenericEnumMapper '。 – jason 2010-10-07 12:37:05

+0

@詹姆斯格雷戈里:这是一个小的VS 2010解决方案,其中包含一个复制问题的失败测试:http://j.mp/bu7wQB – jason 2010-10-08 07:44:01

回答

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

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

0

好吧,我尝试了以下,我认为它会为你工作:
只是overriede里面的接受在MyEnumUserTypeConvention类方法,什么也不做:

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

这没有奏效,我的测试仍然失败。关键是_should_不需要重写'UserTypeConvention'中的任何东西。 – jason 2010-10-15 20:50:54

+0

由于您检查propertyType(status)应该等于MyEnumUserType,因此您的测试失败,但是如果您手动检查了propertyType的类型,则会看到它的类型为Nhibernate CustomType,名称为“MyEnumUserType”,我认为这是应该。 – 2010-10-16 07:17:00

+0

好的,没关系。你说得对。但我的观点是,这应该不需要重写'UserTypeConvention.Accept'仍然存在。 – jason 2010-10-16 12:30:26