Проблема с использованием FluentNHibernate, SQLite и Enums - PullRequest
0 голосов
/ 09 июня 2010

У меня есть приложение на основе Sharp Architecture, использующее Fluent NHibernate с Automapping.У меня есть следующее Enum:

    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; }

    }

Если я создаю экземпляр класса таким образом:

Strategy 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 ]

3 голосов
/ 09 августа 2010

На самом деле, можно сопоставить перечисления с INT, но в SQLite INT будет возвращаться как Int64, и, поскольку вы не можете указать, что ваше перечисление можно долго преобразовывать, вы получите эту ошибку. Я использую NHibernate, поэтому мой обходной путь заключался в создании пользовательского класса AliasToBean, который обрабатывает преобразование полей enum в 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 голосов
/ 10 июня 2010

По умолчанию, emums автоматически преобразуются в строки для SQLite (не знаю, что происходит с SQL Server).

Понятно, что это менее эффективное хранилище, но это не проблема, если у вас действительно большие наборы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...