In EF Core, is it possible to store an entity attribute with an unrelated type?

c# entity-framework-core

Question

I'm building an AspNet Core 2.1 website. My data model includes a Patient Class:

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

Now, I want my application code to deal with Name and DateOfBirth as string and DateTime respectively, but in the underlying table I want BOTH values stored as a string.

  1. Can someone point me to the specific data annotation attributes or Fluent API magic that lets me pap a POCO (Entity class) property to an UNRELATED database column type (i.e., map DateOfBirth to a string [NVARCHAR] database column), and

  2. Once I've got my database column correctly defined, does EF Core give me an extension point to easily insert my own code to translate between the POCO Type and the database column type?

Why would I want to do this (I hear you asking)? Because my website stores sensitive information, and am following the GDPR guidelines and implementing a pseudonymization scheme. The database table behind the Patient class doesn't store the actual data. Rather, it stores keys that identify the data in a separate "vault" database. My website has separate "vault" server with an API interface that stores key/value pairs. Access to the vault server is limited to authorized callers, and all accesses are logged.

So, I want to store the "keys" (strings) in the website database, and have some middleware that talks to the vault API to convert between actual values (from the vault) and keys (from the website database).

But, of course, I want the website code to be unaware of these middleware mechanics. The website code should see the POCO class properties as ordinary, strongly-typed members. All of the Type translation wants to be handled by the middleware.

1
0
6/11/2018 8:51:20 PM

Accepted Answer

Use Value Conversions.

Value converters allow property values to be converted when reading from or writing to the database. This conversion can be from one value to another of the same type (for example, encrypting strings) or from a value of one type to a value of another type (for example, converting enum values to and from strings in the database.)

For example:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Patient>(builder => 
    {
        builder
            .Property(p => p.DateTime)
            .HasConversion(new DateTimeToStringConverter());
    });
}
1
6/11/2018 8:58:58 PM


Related Questions





Related

Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow
Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow