私は作業単位の設計パターンで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() でのみコミットされますか、それとも間違っていますか?
ありがとう、
クリス