NHibernate, SQL Server - перечисление в int - PullRequest
6 голосов
/ 12 апреля 2011

У меня есть класс с типом enum, указывающим, является ли тип сообщения Email или Sms. Тип enum определен:

public enum ReminderType
{
    Email = 1,
    Sms = 2
}

Класс, который использует этот тип, выглядит следующим образом:

public class Reminder : EntityBase
{
    public virtual string Origin { get; set; }
    public virtual string Recipient { get; set; }
    public virtual ReminderType Type { get; set; }
    public virtual Business Business { get; set; }
    public virtual DateTime Created { get; set; }

    public Reminder()
    {
        Created = DateTime.UtcNow;
    }
}

Однако, когда я пытаюсь сохранить сущность типа Reminder в базе данных, я получаю следующую ошибку:

System.Data.SqlClient.SqlException (0x80131904): Conversion failed when converting the nvarchar value 'Email' to data type int.

Поле поддержки имеет тип int, поэтому я не уверен, почему NHibernate пытается отобразить строковое представление по умолчанию. Я использую Fluent NHibernate, и соответствующий код сопоставления:

mappings.Override<Reminder>(map =>
{
     map.Map(x => x.Type).Column("Type")
});

Я почти уверен, что стандартное поведение NHibernate состоит в том, чтобы отображать перечисления как целые, так почему же в этом случае этого не происходит? Я использую SQL Server 2005, если это имеет значение.

Ответы [ 3 ]

5 голосов
/ 12 апреля 2011

Я делаю то же самое и заставляю его работать так ...

В моем случае EmployeeType является классом enum

 Map(x => x.EmployeeType, "EmployeeType_Id").CustomType(typeof (EmployeeType));
3 голосов
/ 12 апреля 2011

Я не знаю, почему этот человек продолжает публиковать, а затем удаляет свой комментарий или ответ, но ссылка, которую он предоставил (), действительно отвечает на мой вопрос.Я решил не использовать полное определение класса удара для соглашения, а вместо этого использовать встроенное соглашение в коде сопоставлений, например:

var mappings = AutoMap.AssemblyOf<Business>()
    .Where(x => x.IsSubclassOf(typeof(EntityBase)))
    .IgnoreBase(typeof(EntityBase))
    .Conventions.Add
    (
        ConventionBuilder.Id.Always(x => x.GeneratedBy.Identity()),
        ConventionBuilder.HasMany.Always(x => x.Cascade.All()),
        ConventionBuilder.Property.Always(x => x.Column(x.Property.Name)),
        Table.Is(o => Inflector.Pluralize(o.EntityType.Name)),
        PrimaryKey.Name.Is(o => "Id"),
        ForeignKey.EndsWith("Id"),
        DefaultLazy.Always(),
        DefaultCascade.All(),

        ConventionBuilder.Property.When(
            c => c.Expect(x => x.Property.PropertyType.IsEnum),
            x => x.CustomType(x.Property.PropertyType))
    );

Последнее утверждение компоновщика соглашения дало результат.Мне любопытно, почему по умолчанию Fluent NHibernate теперь отображает перечисления как строки.Кажется, в этом нет особого смысла.

0 голосов
/ 12 апреля 2011

Вы никогда не должны отображать Enum как int в NHibernate.Это становится причиной наличия призрачных обновлений .

. Лучший способ - просто не задавать свойство типа в сопоставлениях XML.Для достижения этого в Fluent NHibernate вы можете использовать .CustomType(string.Empty).

Некоторую дополнительную информацию вы можете найти здесь

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