サーバーが Entity Framework を ORM として使用するクライアント/サーバー アプリケーションがあります。クライアントに送信されるすべてのエンティティは、DTO クラスによって表されます。
Entity Framework と DTO クラス間のマッピングは、AutoMapper を使用して処理されます。
次のテーブルがあるとします。
Person (string Name, int CountryID) Country (int CountryID, int Population, string Name)
これらは、次の EF クラスによって表されます。
class Person
{
public string Name { get; set; }
public int CountryID { get; set; }
public Country Country { get; set;}
}
class Country
{
public int CountryID { get; set; }
public int Population { get; set; }
public string Name { get; set;}
}
これは、次の DTO で表されます。
class PersonDTO
{
public string Name { get; set; }
public CountryDTO Country { get; set;}
}
class CountryDTO
{
public int CountryID { get; set; }
public int Population { get; set; }
public string Name { get; set;}
}
データベースの初期状態は、空の Person テーブルと、1 つのエントリ (1, 123, 'CountryXYZ') を持つ Country テーブルを表します。
クライアントのアプリ タスクは、新しい Person Entity を作成し、その Country-Reference を使用可能な「CountryXYZ」Country-Entity にアタッチすることです。
そのために、クライアント アプリはまず利用可能な CountryDTO を要求します。次に、新しい PersonDTO インスタンスを作成し、Country プロパティを、サーバーから受信した唯一の CountryDTO に設定します。次に、この PersonDTO インスタンスがサーバーに送り返されます。次に、サーバーは PersonDTO-instance を Person-instance にマップします。
サーバーの最後の手順は、Person-instance を ObjectContext に格納し、ObjectContext.SaveChanges() を呼び出すことです。
このアプローチの問題点は、ObjectContext.SaveChanges() を呼び出すとすぐに、使用可能な Country 行を使用する代わりに、データベースに新しい Country 行が作成されることです。ここで何が欠けていますか?
私はEFを初めて使用しますが、このユースケースはかなり一般的だと思います...簡単に修正できることを願っています。
問題の説明が十分に明確でない場合は、お知らせください。
ありがとう!