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

C# 在EF Core中,是否可以存储具有不相关类型的实体属性?,c#,entity-framework-core,C#,Entity Framework Core,我正在建立一个AspNet核心2.1网站。我的数据模型包括一个患者类: 现在,我希望我的应用程序代码将Name和DateOfBirth分别处理为string和DateTime,但在底层表中,我希望这两个值都存储为string 有人能告诉我具体的数据注释属性或Fluent API magic,让我将POCO实体类属性pap到一个不相关的数据库列类型,即将DateOfBirth映射到字符串[NVARCHAR]数据库列,以及 一旦正确定义了数据库列,EF Core是否会给我一个扩展点,让我可以轻松插入

我正在建立一个AspNet核心2.1网站。我的数据模型包括一个患者类:

现在,我希望我的应用程序代码将Name和DateOfBirth分别处理为string和DateTime,但在底层表中,我希望这两个值都存储为string

有人能告诉我具体的数据注释属性或Fluent API magic,让我将POCO实体类属性pap到一个不相关的数据库列类型,即将DateOfBirth映射到字符串[NVARCHAR]数据库列,以及

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

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

因此,我想将密钥字符串存储在网站数据库中,并使用一些中间件与vault API对话,在vault的实际值和网站数据库的密钥之间进行转换

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

使用

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

例如:

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

是的,您可以使用属性和/或Fluent API来管理您选择的任何模型的数据。您只需要做更多的手工工作,使用更少的自动化功能,并牺牲可维护性;因为在后端转向你自己的数据指南会让人困惑,除非你对你正在做的事情留下明确的指南。好吧,我想我不清楚。我将更新OP。是的,我怀疑我可以使用一些属性组合或fluent API从这里到那里。但我正在努力弄清楚细节。我还没有找到一个属性或fluentapi调用,可以让我将一个类型的POCO属性映射到一个不相关的数据库类型。
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Patient>(builder => 
    {
        builder
            .Property(p => p.DateTime)
            .HasConversion(new DateTimeToStringConverter());
    });
}