DDD、リポジトリ パターン、および ORM に関して、ややばかげた質問があります。この例では、Address、Company、Personの 3 つのクラスがあります。Person は Company のメンバーであり、Address を持っています。会社にも住所があります。
これらのクラスは、データベース モデルを反映しています。モデルの依存関係をすべて削除したため、NHibernate や LinqToSql などの特定の ORM ライブラリに関連付けられていません。これらの依存関係は、リポジトリ内で処理されます。
リポジトリの 1 つの内部には、データベースに既に存在するかどうかに応じて Personを挿入/更新するSavePerson(Person person)メソッドがあります。
Person オブジェクトには Company があるため、現在、その SavePerson 呼び出しを行うときに Company プロパティの値も保存/更新しています。この手続き中に、会社のすべてのデータ (名前と住所) を挿入/更新します。
しかし、Person を処理している間に Company のデータが変更される可能性がある場合を考えるのは非常に困難です。Company を Person に割り当てたり、Person を別の Company に移動したりしたいだけです。新しい人物と一緒に新しい会社を作りたいとは思わない。そのため、SaveCompany 呼び出しにより、不要なデータベース呼び出しが導入されます。Person を保存するときは、CompanyId 列を更新できるはずです。
しかし、Person クラスには Company プロパティがあるため、それを更新または挿入する傾向があります。厳密/純粋な観点から、SavePerson メソッドは Person 全体を保存する必要があります。
好ましい方法は何ですか?Person を保存するとき、またはすべてのデータを保存するときに、Company プロパティの CompanyId を挿入/更新するだけですか? または、両方のシナリオに対して 2 つの異なるメソッドを作成しますか (名前は何にしますか?)
また、別の質問ですが、私は現在、Person、Address、および Company を保存するための個別のメソッドを持っているため、Company を保存するときに SaveAddress も呼び出します。LinqToSql を使用すると仮定します。これは、同じ Linq クエリで Company と Address を挿入/更新しないことを意味します。2 つの Select Calls (会社が存在するかどうかを確認する、住所が存在するかどうかを確認する) があると思います。そして、両方の Insert/Update 呼び出しが 2 回あります。より多くの複合モデル クラスが導入されれば、なおさらです。LinqToSql がこれらの呼び出しを最適化する方法はありますか?
public class Address
{
public int AddressId { get; set; }
public string AddressLine1 { get; set; }
public string AddressLine2 { get; set; }
public string City { get; set; }
public string PostalCode { get; set; }
}
public class Company
{
public int CompanyId { get; set; }
public string Name { get; set; }
public Address Address { get; set; }
}
public class Person
{
public int PersonId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public Company Company { get; set; }
public Address Address { get; set; }
}
編集
このフォローアップの質問も参照してください。値オブジェクトはどのようにデータベースに保存されますか?