2010-09-27 102 views
3

我想在NHibernate中使用Fluent NHibernate映射一個枚舉集合,然後對該枚舉集合的內容執行查詢,但系統每次都會拋出異常。在NHibernate中映射一個枚舉集合

我有一個Widget類,映射到Widget表。還有一個WidgetType枚舉,並且一個Widget實例可以有許多WidgetTypes,通過WidgetTypes屬性映射。該屬性需要映射到一個單獨的表WidgetTypeRef,它帶有兩個整數列:WidgetId和WidgetType。

public class Widget 
{ 
    /* omitted */ 
    public IList<WidgetType> WidgetTypes { get; set; } 
} 
public enum WidgetType 
{ 
    SomeType = 0, 
    SomeOtherType = 1, 
    YetOneMoreType = 2 
} 
public partial class WidgetMapping : IAutoMappingOverride<Widget> 
{ 
    public void Override(AutoMapping<Widget> mapping) 
    { 
    /* omitted */ 
    mapping.HasMany(w => w.WidgetTypes) 
     .Table("WidgetTypeRef") 
     .KeyColumn("WidgetId") 
     .Element("WidgetType"); 
    } 
} 

我無法控制數據庫模式;該架構無法更改。模式必須存儲與Widget關聯的WidgetTypes的整數值,並且不能轉換爲匹配枚舉的字符串版本。我非常努力保持enum的強類型,並且避免爲Ref表創建新實體。

其他類具有與「.CustomType(typeof(someTypeEnum)」配置一起工作的基於枚舉的類型屬性,但HasMany映射中沒有CustomType屬性使用上面的HasMany映射,對集合的查詢拋出「無法確定成員類型」異常

這是甚至可能的?應該如何設置屬性?應如何配置Fluent映射?如何查詢集合(我的查詢只需要與一個Any或Contains)?

回答

2
public class EnumToIntConvention : IUserTypeConvention 
{ 
    public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria) 
    { 
     criteria.Expect(x => x.Property.PropertyType.IsEnum); 
    } 

    public void Apply(IPropertyInstance target) 
    { 
     target.CustomType(target.Property.PropertyType); 
    } 
} 

使用該約定,具有以下枚舉:

public enum Status 
{ 
    Inactive = 0, 
    Active = 1, 
    Canceled = 2 
} 

並設置它像這樣(應與流利的映射工作太):

var cfg = Fluently.Configure() 
    .Database(configurer) 
    .Mappings(m => 
    { 
     m.AutoMappings.Add(AutoMap.Assemblies(Assembly.GetExecutingAssembly()) 
      .Where(type => AutomapAssemblies.Contains(type.Namespace)) 
      .Conventions.Add<EnumToIntConvention>() // Magic code goes here! 
      .Conventions.Add()); 
    }); 

將保存integer值而不是string值。