2

枚举类型且是复合键一部分的属性的映射似乎已从 int 更改为 string,并且无法将其更改回来。

我有这个数据类:

public class Table5
{
    public virtual int Value { get; set; }

    public virtual Level Level { get; set; }

    public virtual string Name { get; set; }

    // Equality operators omitted
}

public enum Level
{
    Hi,
    Lo
}

使用此映射:

public class Table5Map : ClassMap<Table5>
{
    public Table5Map()
    {
        Table("Table5");

        CompositeId()
            .KeyProperty(x => x.Value)
            .KeyProperty(x => x.Level);

        Map(x => x.Name);
    }
}

数据库中的“级别”列是一个整数。

这曾经可以工作,但在他的 Fluent 版本中,它会尝试将字符串“Hi”和“Lo”写入 Level 列。

如何强制它映射到整数?

4

2 回答 2

4

最简单的方法是为键属性设置类型:

CompositeId()
    .KeyProperty(x => x.Value)
    .KeyProperty(x => x.Level, m => m.Type(typeof(int)));

默认情况下,FNH 映射始终枚举为字符串。相反,在 FNH1.0 中,composite-id 中的枚举默认映射到 int。可能是为了修复更高版本中的这种不一致而对其进行了更改。

于 2011-04-05T20:52:26.720 回答
2

尝试对您的映射进行此更改:

/// snip ///
 CompositeId()
    .KeyProperty(x => x.Value)
    .KeyProperty(x => x.Level, c => c.ColumnName("Level").Type(typeof(Level)));
/// snip ///

这个“技巧”让我不得不处理具有许多复合键的遗留数据库。如果您需要非关键属性的等效“技巧”,请在此处查看接受的答案。祝你好运,你的所有数据库可能并不总是“遗留”的!

于 2011-04-05T20:52:08.017 回答