2013-10-14 103 views
0

我有一個數據庫可以被多個系統訪問。我們用Fluent Nhibernate和Automapping讀取表格。驗證或覆蓋FluentNhibernate數據庫到枚舉映射

其中一列是表示枚舉的字符串。在大多數安裝中,這很好,但是現在又有另一個系統會持續一個無效值。我怎樣才能捕獲這些無效值並轉換或忽略它們?

例子:

Database Table: 
ID MyEnum 
0 "One" 
1 "Two" 
2 "Invalid" 

MyEnum 
{ 
    One, 
    Two 
} 
我已經使用 IAutoMappingOverride與我的模型

,反正是有一個函數傳遞給映射器做驗證/轉換(比如我想任何未知轉化爲MyEnum.One)? 還是有更簡單的方法,我失蹤了?

在那裏我得到了使用和添加

mapping.Map(x => x.Type).CustomType(typeof(SafeEnumType<EventType>)); 

here

class SafeEnumType<T> : ImmutableUserType where T : struct 
{ 
    public override object NullSafeGet(IDataReader rs, string[] names, object owner) 
    { 
     T value; 
     if (Enum.TryParse((string)rs[names[0]], out value)) 
      return value; 
     else 
      return default(T); 
    } 

    public override void NullSafeSet(IDbCommand cmd, object value, int index) 
    { 
     NHibernateUtil.String.NullSafeSet(cmd, value.ToString(), index); 
    } 

    public override Type ReturnedType 
    { 
     get { return typeof(T); } 
    } 

    public override SqlType[] SqlTypes 
    { 
     get { return new[] { SqlTypeFactory.GetString(100) }; } 
    } 
} 

@Firo's answer組合和答案here和我AutomapOverride.Override() FN

回答

1

在NHibernate中有IUserType這讓您定義自定義轉換代碼。 here是一個基類礦井,你可以使用,因爲枚舉是不可改變的類型

代碼

class SpecialEnumUserType : ImmutableUserType 
{ 
    public override object NullSafeGet(IDataReader rs, string[] names, object owner) 
    { 
     TheSpecialEnum value; 
     if (Enum.TryParse<TheSpecialEnum>((string)rs[names[0]], out value)) 
      return value; 
     else 
      return default(TheSpecialEnum); 
    } 

    public override void NullSafeSet(IDbCommand cmd, object value, int index) 
    { 
     NHibernateUtil.String.NullSafeSet(cmd, value.ToString(), index); 
    } 

    public override Type ReturnedType 
    { 
     get { return typeof(TheSpecialEnum); } 
    } 

    public override SqlType[] SqlTypes 
    { 
     get { return new[] { SqlTypeFactory.GetString(50) }; } 
    } 
} 

,並約定將其應用到每一個枚舉財產

class EnumHandlingConvention : IPropertyConvention 
{ 
    public void Apply(IPropertyInstance instance) 
    { 
     if (instance.Type == typeof(TheSpecialEnum)) 
     { 
      instance.CustomType<SpecialEnumUserType>(); 
     } 
    } 
} 
+0

好吧,這不是很整齊我的目的,雖然。是否有一種更簡單的方法來攔截數據庫以便爲特定屬性提供對象步驟? –

+0

這是最簡單的方法。 IUserType的確切問題是什麼? – Firo

+0

特別想處理一個特定的枚舉,如果你編輯你的答案我會接受它,thx。 –