使用FluentNHibernate,SQLite和Enums时遇到问题

时间:2010-06-08 21:59:36

标签: sqlite fluent-nhibernate

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

    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 =新策略{Name =“Test”,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中运行良好。

有关解决方法的任何想法吗?

感谢。

2 个答案:

答案 0 :(得分: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>();
}

答案 1 :(得分:0)

默认情况下,emums会自动转换为SQLite的字符串(不知道SQL Server会发生什么)。

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