我正在构建一个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为string
和DateTime
,但在基础表中我希望将两个值存储为字符串。
有人可以指向我的特定数据注释属性或Fluent API魔术,它允许我将POCO(实体类)属性设置为UNRELATED数据库列类型(即,将DateOfBirth映射到字符串[NVARCHAR]数据库列),和
一旦我正确定义了我的数据库列,EF Core是否为我提供了一个扩展点,可以轻松插入我自己的代码以在POCO类型和数据库列类型之间进行转换?
为什么我要这样做(我听到你问)?因为我的网站存储敏感信息,并且遵循GDPR指南并实施假名化方案。 Patient类后面的数据库表不存储实际数据。相反,它将标识数据的密钥存储在单独的“保险库”数据库中。我的网站有单独的“保险库”服务器和一个存储键/值对的API接口。对Vault服务器的访问仅限于授权的呼叫者,并且会记录所有访问。
因此,我想在网站数据库中存储“密钥”(字符串),并且有一些与Vault API对话的中间件,用于在实际值(来自Vault)和密钥(来自网站数据库)之间进行转换。
但是,当然,我希望网站代码不知道这些中间件机制。网站代码应将POCO类属性视为普通的强类型成员。所有类型转换都希望由中间件处理。
答案 0 :(得分:1)
值转换器允许在读取或写入数据库时转换属性值。此转换可以是相同类型的一个值(例如,加密字符串),也可以是一种类型的值转换为另一种类型的值(例如,将枚举值转换为数据库中的字符串。)< / p>
例如:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Patient>(builder =>
{
builder
.Property(p => p.DateTime)
.HasConversion(new DateTimeToStringConverter());
});
}