2013-12-13 132 views
1

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

我正在使用EF6。

我不想代码首先,自动将改变数据库中的任何结构,所以我用

Database.SetInitializer<mycontext>(null); 

现在我卡在以下问题:

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

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

但是,在其中一个遗留数据库中,值是相反的。表“性别”存在,该表中的查找数据是ID 1 =女性,ID 2 =男性。 Person表具有“FK性别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来说是否可能,如果没有,是否有解决方法?

谢谢。

回答

0

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

(是的,如果你喜欢在凌晨2点接听电话,你只能使用一个枚举类型)

+0

感谢您的回复。我希望在EF映射API中可以存在某种功能来解决这个问题,但是要感谢提供有关可能的解决方法的信息 – tjeuten