我需要创建一个与各种遗留数据库系统兼容的应用程序。 因此,数据库存在,但我仍然希望首先使用代码独立于用作数据存储区的任何数据库。对于每个部署,我打算创建一个“映射”库,其中包含实体到数据库的正确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,如果没有,是否有解决方法?
感谢。
答案 0 :(得分:0)
我不认为你想要做的事情是可能的。为简单起见,您应该考虑更改代码以匹配数据库中的代码。如果你不能这样做就是你能做的。定义枚举类型(类似GenderDb
或类似内容)。理想情况下,没有人应该看到这个枚举。然后创建GenderDb
类型的私有属性并将它们映射到数据库列(我相信EF可以map columns to private properties)。属性再次是私有的,所以没有人可以看到它们。然后在具有私有Gender
属性的实体上添加GenderDb
类型的公共属性。应将公共属性配置为未映射/忽略。现在实现公共属性的setter和getter,以便相应地转换值(即setter将Gender
枚举转换为GenderDb
并设置私有属性,getter读取私有属性并转换{{ 1}}到GenderDb
)。
(是的,如果您希望在凌晨2点接听电话,您只需使用一种枚举类型即可)