我使用基于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中运行良好。
有关解决方法的任何想法吗?
感谢。
答案 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会发生什么)。
显然,存储效率较低,但除非您拥有非常庞大的数据集,否则这可能不是问题。