NHibernate,SQL Server - 枚举到int映射

时间:2011-04-11 21:02:23

标签: sql-server-2005 nhibernate fluent-nhibernate

我有一个具有枚举类型的类,指示消息类型是Email还是Sms。枚举类型定义为:

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 个答案:

答案 0 :(得分:5)

我正在做同样的事情并让它像这样工作......

在我的情况下,EmployeeType是枚举类

 Map(x => x.EmployeeType, "EmployeeType_Id").CustomType(typeof (EmployeeType));

答案 1 :(得分:3)

我不知道为什么这个人会一直发帖然后删除他们的评论或回答,但他们提供的链接()确实回答了我的问题。我选择不使用约定的完整类定义,而是选择映射代码中的内联约定,如下所示:

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的默认设置是将枚举映射为字符串。这似乎没有多大意义。

答案 2 :(得分:0)

你不应该在NHibernate中将Enum映射为int。这成为拥有ghost updates的理由。

最好的方法是不在XML映射中设置type属性。要在Fluent NHibernate中实现这一点,您可以使用.CustomType(string.Empty)

您可以找到一些其他信息here