【问题标题】:Problem using FluentNHibernate, SQLite and Enums使用 FluentNHibernate、SQLite 和枚举的问题
【发布时间】:2010-06-08 21:59:35
【问题描述】:

我有一个使用 Fluent NHibernate 和 Automapping 的基于 Sharp Architecture 的应用程序。我有以下枚举:

公共枚举主题 { 加减 = 1, 乘除 = 2, 小数分数 = 3 }

和下面的类:

公共类策略:BaseEntity { 公共虚拟字符串名称 { 获取;放; } 公共虚拟主题主题{获取;放; } 公共虚拟 IList 项目 { 获取;放; } }

如果我这样创建类的实例:

策略 s = new Strategy { Name = "Test", Topic = Topics.AdditionSubtraction };

它可以正确保存(感谢这个映射约定:

公共类 EnumConvention : IPropertyConvention, IPropertyConventionAcceptance { 公共无效应用(FluentNHibernate.Conventions.Instances.IPropertyInstance 实例) { instance.CustomType(instance.Property.PropertyType); } 公共无效接受(FluentNHibernate.Conventions.AcceptanceCriteria.IAcceptanceCriteria 标准) { 标准.Expect(x => x.Property.PropertyType.IsEnum); } }

但是,在检索时(当 SQLite 是我的数据库时)我收到有关尝试将 Int64 转换为主题的错误。

这在 SQL Server 中运行良好。

有什么解决方法的想法吗?

谢谢。

【问题讨论】:

    标签: sqlite fluent-nhibernate


    【解决方案1】:

    实际上,可以将枚举映射到 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>();
    }
    

    【讨论】:

      【解决方案2】:

      默认情况下,emum 会自动映射到 SQLite 的字符串(不知道 SQL Server 会发生什么)。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-01-10
        • 2011-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-31
        • 2013-11-06
        相关资源
        最近更新 更多