Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 NHibernate,SQL Server-枚举到int映射_Sql Server 2005_Nhibernate_Fluent Nhibernate - Fatal编程技术网

Sql server 2005 NHibernate,SQL Server-枚举到int映射

Sql server 2005 NHibernate,SQL Server-枚举到int映射,sql-server-2005,nhibernate,fluent-nhibernate,Sql Server 2005,Nhibernate,Fluent Nhibernate,我有一个类,它的枚举类型指示消息类型是电子邮件还是Sms。枚举类型已定义为: public enum ReminderType { Email = 1, Sms = 2 } 使用此类型的类如下所示: public class Reminder : EntityBase { public virtual string Origin { get; set; } public virtual string Recipient { get; set; } pub

我有一个类,它的枚举类型指示消息类型是电子邮件还是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")
});
mappings.Override(映射=>
{
map.map(x=>x.Type).Column(“Type”)
});

我很确定NHibernate的默认行为是将枚举映射为int,那么在这种情况下为什么不这样做呢?我正在使用SQL Server 2005,如果这很重要的话。

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

在我的例子中,EmployeeType是枚举类

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

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

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))
    );
var-mappings=AutoMap.AssemblyOf()
其中(x=>x.IsSubclassOf(typeof(EntityBase)))
.IgnoreBase(类型(EntityBase))
.Add
(
ConventionBuilder.Id.Always(x=>x.GeneratedBy.Identity()),
ConventionBuilder.HasMany.Always(x=>x.Cascade.All()),
ConventionBuilder.Property.Always(x=>x.Column(x.Property.Name)),
表.Is(o=>definctor.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))
);

上一个convention builder语句成功了。我很好奇为什么Fluent NHibernate的默认设置是现在将枚举映射为字符串。这似乎没有多大意义。

在NHibernate中永远不应该将Enum映射为int。这就成为了拥有一个好朋友的理由

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


您可以找到一些其他信息

电子邮件是Type属性的字符串值。Nhibernate应该尝试将其存储为整数值1,但它尝试存储字符串“Email”,因此出现错误。我不知道它为什么这样做……或者当你把一个枚举映射为int时,只有那个应用(定义了枚举)知道它在数据库中的含义。这就像是数据库中的一个神奇数字……对不起,我删除了第一条注释,因为在重新阅读代码后,我意识到我犯了错误,并且注释不相关,而第二条注释似乎很明显,因为它是谷歌最早点击的内容之一,所以我想你已经看到了。@dotjoe:听起来很合理。不过,我曾经使用过与此相反的库的早期版本(默认情况下映射为int而不是string),因此这种行为的改变开始出现时令人难以置信地困惑。如果我想在特定于属性的基础上进行此操作,这将是完美的。