9

DDD、リポジトリ パターン、および ORM に関して、ややばかげた質問があります。この例では、AddressCompanyPersonの 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; }

}

編集

このフォローアップの質問も参照してください。値オブジェクトはどのようにデータベースに保存されますか?

4

2 に答える 2