2010-10-07 74 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