1

私は作業単位の設計パターンでEntity Frameworkとリポジトリを使用しています。

時々、自分の作業単位で、別のサービスに対して別の呼び出しを行っています。

このサービスは、独自の作業単位インスタンスを作成しています。次に例を示します。

ISettingsService settingsService = UnityContainer.Resolve<ISettingService>();
using (IUnitOfWork unitOfWork = UnitOfWorkFactory.CreateUnitOfWork())
{
    List<Company> companies = unitOfWork.CompaniesRepository.GetAll();
    foreach(Company company in companies)
    {
        settingsService.SaveSettings(company, "value to set");
        company.Processed = DateTime.UtcNow();
    }
    unitOfWork.Save();
}

// ISettingsService.SaveSettings code in another module...
ISettingsService.SaveSettings(Company company, string value)
{
    using (IUnitOfWork unitOfWork = UnitOfWorkFactory.CreateUnitOfWork())
    {
        Setting setting = new Setting();
        setting.CompanyID = company.CompanyID;
        setting.SettingValue = value;
        unitOfWork.Insert(setting);
        unitOfWork.Save();
    }
}

上記のコードは機能しますが、会社のオブジェクトをアタッチするのではなく、ID を明示的に参照する必要があります (他のサービスの他の作業単位によって既に追跡されているため、エラーがスローされます)。

私が知る限り、これには3つの方法があります。

1) 独自の作業単位インスタンスを作成するサービス レイヤーでコードをそのまま使用します。他のエンティティへのその他の参照は、主キー ベースで行われます (値を設定する手順は、主キー オブジェクト値、つまり int によって渡される必要があります)。顧客ID)。

これの悪い面は、データベースへのヒットが増える可能性があることです。エンティティの主キーのタイプが変更された場合、ID フィールドのすべてのサービス レイヤー参照を変更する必要があります。__

2) サービス層がエンティティ オブジェクトを参照として受け入れるようにします。オブジェクトを渡すことができるので、これはいいでしょう。

これの悪い面は、エンティティが他のコンテキストから参照されてはならず、エンティティが使用されるコンテキストに関連付けられている必要があることです。ループでは、エンティティはおそらく既にアタッチされています。__

3) 作業単位のインスタンス化を他のサービス層に渡して、独自の作業単位をインスタンス化する代わりに、既存の作業単位を使用できるようにします。

これには、作業単位の参照を渡す必要がある以外にマイナス面があるかどうかはわかりませんが、オブジェクトをアタッチしたり、既にアタッチされているかどうかを心配したりせずにオブジェクトを参照できるという利点があります。__

要約すると、1 つのアクセス設計を標準化する必要があり、どの設計を選択すべきかについての推奨事項をいただければ幸いです。

さらに、私が心配する必要があるトランザクションに何かありますか、または変更されたトランザクション処理の形式を暗黙的に実装する作業単位の設計パターンを持つ EntityFramework は、context.Save() でのみコミットされますか、それとも間違っていますか?

ありがとう、

クリス

4

1 に答える 1

1

それらの中にはいくつかのオプションがあります。

  1. さまざまなサービスに、切り離されたエンティティ (そのエンティティ) (エンティティではない DTO でさえも) を渡させ、各サービスにそれらをエンティティに変換させます (または主キーを使用させます)。

    各サービスは独自のコンテンツを作成し、独自の EDMX または共有 EMDX (または複数の EDMX) を使用できます。

  2. サービスが同じ EDMX を使用している場合は、それらに同じコンテキストを挿入します (EF を公開しないように、背後にラップしてインターフェイスすることができます)。

  3. サービスが同じ EDMX を使用しない場合は、次のいずれかを行います。

    3.1. 異なるサービス (ま​​たは DTO) に対して異なるエンティティを使用して、オプション 1 を使用します。

    異なるエンティティを使用して EDMX 間でテーブルを「共有」するか、ビューを使用して「外部ドメインからのテーブル」を作成し、テーブルの読み取り専用バージョンを他のドメインに反映させることができます。

    3.2. EDMX を 1 つの大きなものにマージして、マスター EDMX を作成します (詳細については、この質問を参照してください)。

変更は context.AcceptChanges() を呼び出すときにのみ適用されるため、変更を複数のコンテキストに保存し、すべての保存が完了した後にそれぞれの変更を受け入れることができます。

于 2012-06-05T19:26:23.613 に答える