EF が 3 層の WPF アプリケーションで最新のデータを返さないという問題があり、コンテキストの有効期間を処理する方法に関係があると思われます。これはシナリオです:
UnitOfWork 内にラップされたリポジトリがいくつかあります。UnitOfWork を使用する 1 つのサービス (MyService) もあります。この UnitOfWork は、サービスを介さずに、UI から直接呼び出す必要もあります。
ある時点で、メイン ウィンドウの ViewModel で新しいウィンドウを作成します (最初に ViewModel を使用します)。
var dialog = new DialogViewModel(_eventAggregator, _unitOfWork, Container.Resolve<CarService>());
このメイン ウィンドウ ViewModel には、コンストラクターに挿入された UnitOfWork があり、DialogViewModel に渡されます。
CarService のコンストラクターには UnitOfWork も必要で、これもコンストラクターに挿入されます。
public CarService(IUnitOfWork unitOfWork){
_unitOfWork = unitOfWork;
}
DialogViewModel で CarService を使用してクエリを作成し、データを取得して更新すると、最初は正常に動作します。ただし、次にそのデータを取得するために同じクエリが実行されると、最新の変更されたデータを返す代わりに、古い/キャッシュされたデータが返されます。UnitOfWork (CarService 内) を使用したクエリは次のようになります。
var values = _unitOfWork.GarageRepository.GetSomeValues();
_unitOfWork.GarageRepository.MakeSomeChangesToTheValuesUsingStoredProcedure();
これが 2 回目に呼び出されたとき、値には最新バージョンのデータが含まれていません。ただし、DB では正常に更新されています。
私は Unity を使用して DI を行っています。これが私のコンテナーの外観です。
public class Container
{
public static UnityContainer Container = new UnityContainer();
// Called once in the AppBoostraper, as soon as the GUI application starts
public void BuildUp()
{
Container.RegisterType<IUnitOfWork, UnitOfWork>();
Container.RegisterType<ICarService, CarService>();
}
}
正しいデータが返されないのはなぜですか?どうすれば修正できますか?