在EF Core中,是否可以存储具有不相关类型的实体属性?

时间:2018-06-11 19:58:55

标签: c# entity-framework-core

我正在构建一个AspNet Core 2.1网站。我的数据模型包含Patient类:

public class Patient
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime DateOfBirth { get; set; }
}

现在,我希望我的应用程序代码分别处理Name和DateOfBirth为stringDateTime但在基础表中我希望将两个值存储为字符串。

  1. 有人可以指向我的特定数据注释属性或Fluent API魔术,它允许我将POCO(实体类)属性设置为UNRELATED数据库列类型(即,将DateOfBirth映射到字符串[NVARCHAR]数据库列),和

  2. 一旦我正确定义了我的数据库列,EF Core是否为我提供了一个扩展点,可以轻松插入我自己的代码以在POCO类型和数据库列类型之间进行转换?

  3. 为什么我要这样做(我听到你问)?因为我的网站存储敏感信息,并且遵循GDPR指南并实施假名化方案。 Patient类后面的数据库表不存储实际数据。相反,它将标识数据的密钥存储在单独的“保险库”数据库中。我的网站有单独的“保险库”服务器和一个存储键/值对的API接口。对Vault服务器的访问仅限于授权的呼叫者,并且会记录所有访问。

    因此,我想在网站数据库中存储“密钥”(字符串),并且有一些与Vault API对话的中间件,用于在实际值(来自Vault)和密钥(来自网站数据库)之间进行转换。

    但是,当然,我希望网站代码不知道这些中间件机制。网站代码应将POCO类属性视为普通的强类型成员。所有类型转换都希望由中间件处理。

1 个答案:

答案 0 :(得分:1)

使用Value Conversions

  

值转换器允许在读取或写入数据库时​​转换属性值。此转换可以是相同类型的一个值(例如,加密字符串),也可以是一种类型的值转换为另一种类型的值(例如,将枚举值转换为数据库中的字符串。)< / p>

例如:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Patient>(builder => 
    {
        builder
            .Property(p => p.DateTime)
            .HasConversion(new DateTimeToStringConverter());
    });
}