2010-06-08 39 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会发生什么情况)。

显然效率较低的存储很明智,但这可能不是问题,除非您拥有非常庞大的数据集。