質問: 私はAspNet Core 2.1 Webサイトを構築しています。私のデータモデルには`Patient`クラスが含まれています: ``` public class Patient { public int Id { get; set; } public string Name { get; set; } public DateTime DateOfBirth { get; set; } } ``` さて、アプリケーションコードでNameとDateOfBirthをそれぞれ`string`と`DateTime`として処理し**たいが、基になるテーブルでは、両方の値を文字列として保存したい。** 1. 誰かが、特定のデータ注釈属性またはFluent APIマジックを使用して、POCO(Entityクラス)プロパティを無関係のデータベース列タイプ(つまり、DateOfBirthを文字列[NVARCHAR]データベース列にマップ)にすることができますか? 2. いったん私のデータベース列が正しく定義されたら、EF Coreは拡張ポイントを与えてPOCOタイプとデータベース列タイプの間で変換するための自分のコードを簡単に挿入できますか? なぜ私はこれをしたいのですか(私はあなたが聞いて聞いています)?私のウェブサイトは機密情報を保管しており、GDPRのガイドラインに従い偽名化スキームを実装しているためです。 Patientクラスの背後にあるデータベーステーブルには、実際のデータは格納されません。むしろ、データを識別するキーを別の「ボールト」データベースに格納します。私のウェブサイトには、キーと値のペアを格納するAPIインターフェイスを備えた別の「ボールト」サーバーがあります。ボールトサーバーへのアクセスは、許可された発信者に限定され、すべてのアクセスはログに記録されます。 したがって、私はウェブサイトデータベースに "キー"(文字列)を保存し、実際の値(ボールトから)とキー(ウェブサイトデータベースから)を変換するためにボールトAPIと会話するミドルウェアをいくつか持っています。 しかし、もちろん、私はウェブサイトのコードがこれらのミドルウェアの仕組みを知らないことを望んでいます。 Webサイトのコードでは、POCOクラスのプロパティが通常の強く型付けされたメンバーとして表示されます。すべてのタイプ変換は、ミドルウェアによって処理されることを望んでいます。
回答: 値の変換を使用します。 > 値コンバータを使用すると、データベースの読み書き時にプロパティ値を変換できます。この変換は、同じ型の別の値(文字列の暗号化など)またはある型の値から別の型の値(たとえば、列挙型の値をデータベースの文字列に変換するなど)にすることができます。 > > 例えば: ``` protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity(builder => { builder .Property(p => p.DateTime) .HasConversion(new DateTimeToStringConverter()); }); } ```