Разбор enum не работает с Fluent NHibernate - PullRequest
15 голосов
/ 16 июля 2010

У меня есть класс доступа к данным с Enum под названием Salutation:

 public enum Salutation
  {
    Unknown = 0,
    Dame = 1,
    etc
    Mr = 5,
    etc
  }

Я пользуюсь этим классом с помощью NHibernate, и до сегодняшнего утра я использовал для сопоставления файлы .hbm.xml.Однако теперь я переключился на использование Fluent NHibernate, но загрузка экземпляров класса завершается неудачно с (например):

[HibernateException: невозможно проанализировать 5 как приветствие]

Как выможно видеть, что 5 должен быть разбирается как приветствие (при условии, что 5 - это целое число, из сообщения об ошибке это невозможно определить).

Кто-нибудь знает, что здесь происходит?

Спасибо

Дэвид

Ответы [ 2 ]

34 голосов
/ 16 июля 2010

Это намного проще, чем я думал.

Map(x => x.WhateverThePropertyNameIs).CustomType(typeof(MyEnumeration));
1 голос
/ 27 марта 2013

Используется другой вариант, EnumConvention:

using System;

using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TestApp
{
    using FluentNHibernate.Conventions;
    using FluentNHibernate.Conventions.AcceptanceCriteria;
    using FluentNHibernate.Conventions.Inspections;
    using FluentNHibernate.Conventions.Instances;

    public class EnumConvention :
        IPropertyConvention,
        IPropertyConventionAcceptance
    {
        #region IPropertyConvention Members

        public void Apply(IPropertyInstance instance)
        {
            instance.CustomType(instance.Property.PropertyType);
        }

        #endregion

        #region IPropertyConventionAcceptance Members

        public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria)
        {
            criteria.Expect(x => x.Property.PropertyType.IsEnum ||
            (x.Property.PropertyType.IsGenericType &&
             x.Property.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>) &&
             x.Property.PropertyType.GetGenericArguments()[0].IsEnum)
            );
        }

        #endregion
    }
}

Чтобы использовать это enumconvention:

...
var fluentCfg = Fluently.Configure().Database(cfg).Mappings(
                    m => m.FluentMappings.AddFromAssemblyOf<SomeObjectMap>().Conventions.Add<EnumConvention>());
...

И в файле сопоставления,

Map(x => x.SomeEnumField);
...