2014-01-05 38 views
0

我有了一個枚舉類型的屬性模型:可以將NHibernate配置爲自動爲特定類型的所有列調用.CustomType <T>?

public virtual Units Unit { get; set; } // Units is an enum 

我有一個叫EnumMapper類,它處理一些自定義映射邏輯我有我的數據庫使用。在我的地圖中,我有:

Map(x => x.Unit).CustomType<EnumMapper<Units>>(); 

這很好。沒有問題。不過,我也有不少型號具有Units類型的屬性。我想知道是否可以添加一些東西給我的FluentConfiguration對象,告訴NHibernate使用類型的任何和所有屬性的Units類型的這種類型映射,而不是在每一個上調用.CustomType<T>()。下面是如何配置的NHibernate至今:

private ISessionFactory InitializeSessionFactory() 
{ 
    sessionFactory = Fluently.Configure() 
     .Database(DatabaseConfiguration) 
     .Mappings(m => m.FluentMappings 
      .AddFromAssemblyOf<DatabaseAdapter>() 
      .Conventions.Add(Table.Is(x => x.EntityType.Name.ToLowerInvariant())) // All table names are lower case 
      .Conventions.Add(ForeignKey.EndsWith("Id"))       // Foreign key references end with Id 
      .Conventions.Add(DefaultLazy.Always())) 
     .BuildSessionFactory(); 

    return sessionFactory; 
} 

我有一種感覺,這是因爲調用別的.Conventions.Add()一樣簡單,但我似乎無法得到它的權利。

回答

0

想通了使用ConventionBuilder一個解決辦法:

.Conventions.Add(ConventionBuilder.Property.When(
    c => c.Expect(x => x.Type == typeof(GenericEnumMapper<Units>)), 
    x => x.CustomType<EnumMapper<Units>>() 
)) 

這不是超級靚,但它的作品。我認爲更好的解決方案可能是編寫我自己的convention,它自動將枚舉映射到其正確的自定義類型。我會在這裏發佈,如果我得到它的工作。

更新:清理了一下。我添加了一個靜態方法來我EnumMapper<T>類:

.Conventions.Add(EnumMapper<Units>.Convention) 

public class EnumMapper<T> : NHibernate.Type.EnumStringType<T> 
{ 
    // Regular mapping code here 

    public static IPropertyConvention Convention 
    { 
     get 
     { 
     return ConventionBuilder.Property.When(
      c => c.Expect(x => x.Type == typeof (GenericEnumMapper<T>)), 
      x => x.CustomType<EnumMapper<T>>() 
      ); 
     } 
    } 
} 

現在我只是將其配置

相關問題