EF Code First映射枚举与自定义值映射

时间:2013-12-13 07:50:50

标签: c# entity-framework enums ef-code-first

我需要创建一个与各种遗留数据库系统兼容的应用程序。 因此,数据库存在,但我仍然希望首先使用代码独立于用作数据存储区的任何数据库。对于每个部署,我打算创建一个“映射”库,其中包含实体到数据库的正确FluentAPI映射。

我正在使用EF6。

我不希望代码首先自动更改数据库结构中的任何内容,因此我使用

Database.SetInitializer<mycontext>(null);

现在我坚持以下问题:

我的代码定义了一个枚举Gender,它在Person实体中用作属性

public enum Gender
{
    M = 1,
    F = 2
}

但是,在其中一个旧数据库中,值是相反的。表“性别”存在,该表中的查找数据是ID 1 =女性,ID 2 =男性。 Person表有一个“FK Gender ID”列。

我如何通过Fluent API配置Person实体的Gender属性到旧数据库表中Person表的映射。

modelbuilder.Entity<Person>()
.Property(c => c.Gender)
.HasColumnName("FK Gender ID") //--> and how to "inverse" these values here ?

这是否可以使用Fluent API,如果没有,是否有解决方法?

感谢。

1 个答案:

答案 0 :(得分:0)

我不认为你想要做的事情是可能的。为简单起见,您应该考虑更改代码以匹配数据库中的代码。如果你不能这样做就是你能做的。定义枚举类型(类似GenderDb或类似内容)。理想情况下,没有人应该看到这个枚举。然后创建GenderDb类型的私有属性并将它们映射到数据库列(我相信EF可以map columns to private properties)。属性再次是私有的,所以没有人可以看到它们。然后在具有私有Gender属性的实体上添加GenderDb类型的公共属性。应将公共属性配置为未映射/忽略。现在实现公共属性的setter和getter,以便相应地转换值(即setter将Gender枚举转换为GenderDb并设置私有属性,getter读取私有属性并转换{{ 1}}到GenderDb)。

(是的,如果您希望在凌晨2点接听电话,您只需使用一种枚举类型即可)