2010-06-08 75 views
0

我有一個基於夏普架構的應用程序使用Fluent NHibernate自動映射。我有以下枚舉:問題使用FluentNHibernate,SQLite和枚舉

 
    public enum Topics 
    { 
     AdditionSubtraction = 1, 
     MultiplicationDivision = 2, 
     DecimalsFractions = 3 
    } 

及以下類:

 
    public class Strategy : BaseEntity 
    { 
     public virtual string Name { get; set; } 
     public virtual Topics Topic { get; set; } 
     public virtual IList Items { get; set; } 

    } 

如果我創建正是如此類的一個實例:

策略S =新戰略{名稱= 「測試」 ,Topic = Topics.AdditionSubtraction};

它可以正確保存(感謝這個映射約定:

 
    public class EnumConvention : IPropertyConvention, IPropertyConventionAcceptance 
    { 
     public void Apply(FluentNHibernate.Conventions.Instances.IPropertyInstance instance) 
     { 
      instance.CustomType(instance.Property.PropertyType); 
     } 

     public void Accept(FluentNHibernate.Conventions.AcceptanceCriteria.IAcceptanceCriteria criteria) 
     { 
      criteria.Expect(x => x.Property.PropertyType.IsEnum); 
     } 
    } 

然而,在檢索時(SQLite是我的分貝)我得到關於企圖的Int64轉換爲主題的錯誤

此。在SQL Server中正常工作。

的解決方法,任何想法?

感謝。

回答

3

實際上,可以將枚舉映射到INT,但在SQLite中,INT將作爲Int64返回,並且由於您無法指定您的枚舉可以轉換爲long,所以會出現此錯誤。我使用NHibernate的,所以我的解決方法是創建一個自定義AliasToBean類來處理轉換枚舉領域的Int32:

public class AliasToBeanWithEnums<T> : IResultTransformer where T : new() 
{ 
    #region IResultTransformer Members 

    public IList TransformList(IList collection) 
    { 
     return collection; 
    } 

    public object TransformTuple(object[] tuple, string[] aliases) 
    { 
     var t = new T(); 
     Type type = typeof (T); 
     for (int i = 0; i < aliases.Length; i++) 
     { 
      string alias = aliases[i]; 
      PropertyInfo prop = type.GetProperty(alias); 
      if (prop.PropertyType.IsEnum && tuple[i] is Int64) 
      { 
       prop.SetValue(t, Convert.ToInt32(tuple[i]), null); 
       continue; 
      } 

      prop.SetValue(t, tuple[i], null); 
     } 

     return t; 
    } 

    #endregion 
} 

用法:

public IList<ItemDto> GetItemSummaries() 
{ 
    ISession session = NHibernateSession.Current; 

    IQuery query = session.GetNamedQuery("GetItemSummaries") 
     .SetResultTransformer(new AliasToBeanWithEnums<ItemDto>()); 

    return query.List<ItemDto>(); 
} 
0

默認情況下,emums會自動映射到SQLite的字符串(不知道SQL Server會發生什麼情況)。

顯然效率較低的存儲很明智,但這可能不是問題,除非您擁有非常龐大的數據集。