こんにちは私はEF4コンテキストで作業単位パターンを使用しています。
コンテキストは、すべてが機能するいくつかのメソッドに渡され、完了したら、変更の保存を呼び出します。
後でオブジェクトの状態をチェックすると、新しい値ではなく古い値になります。それでも、その時点で変更の保存を呼び出すと、コンテキストに表示されると予想される状態がデータベースに保存されます。
基本的に、コールスタックは
Context ctx;
UpdateItems(ctx);
CheckItemsValid(ctx);
DoSomehtingElse(ctx); //Saving changes here.
で行われた変更を確認できないため、CheckItemsValid
は失敗してUpdateItems
いますが、同じコンテキストです。
すべてをTransactionScopeでラップし、チェック項目を呼び出す前にSaveChangesを呼び出すと、すべてが機能しますが、ちょっとした大ハンマーのように見えます。
update itemsメソッドでアイテムを更新した後、次のことを試しました。
ApplyCurrentValues();
Refresh(ClientWins);
AcceptAllChanges();
誰かが以前にこの問題を見たことがありますか、それとも私はすべてを処理し、フローの途中で変更を保存するように呼び出す必要がありますか?
using (EntitiesContext ctx = EntityFactory.GetEntitiesContext())
{
Repairs.RepairManager repman = new Repairs.RepairManager();
repman.SetAllRepairsOfTypeToComplete(vehicle.VehicleId, RepairTypes.BodyShop, vehicle.SiteVisitId.Value, technicianId, ctx);
SchemeManager sm = new SchemeManager();
result = sm.ProcessVehicle(AutoMapper.Mapper.Map<EFVehicle, AbstractVehicle>(ctx.EFVehicles.Single(p => p.VehicleID == vehicle.VehicleId), new Vehicle()), ref intrules, userId, ctx, false);
if (result == true)
{
ctx.SaveChanges();
}
これは、プロセスビークル呼び出しがSetAllRepairsOfTypeToCompleteが成功したことを確認するためのベースです。
すべての修復を完了するように設定すると、コンテキストctx.EFRepairsにある修復リストでtrueからfalseにビットが更新されます。
var cancelledrepairs = ((EntitiesContext)Context).EFRepairs.Where(p => p.VehicleID == vehicle.VehicleId && p.VehicleSiteVisitID == vehicle.SiteVisitId
&& p.RepairTypeID == (int)RepairTypes.BodyShop && p.RepairStatusID == (int)RepairStatusEnum.Cancelled).Count();
var completedMechrepairs = ((EntitiesContext)Context).EFRepairs.Where(p => p.VehicleID == vehicle.VehicleId && p.VehicleSiteVisitID == vehicle.SiteVisitId
&& p.RepairTypeID == (int)RepairTypes.BodyShop && p.RepairStatusID == (int)RepairStatusEnum.Completed).Count();
var CurrentMechanicalRepairs = ((EntitiesContext)Context).EFRepairs.Where(p=> p.VehicleID == vehicle.VehicleId && p.VehicleSiteVisitID == vehicle.SiteVisitId
&& p.RepairTypeID == (int)RepairTypes.BodyShop).Count();
if ((completedMechrepairs + cancelledrepairs) == CurrentMechanicalRepairs)
return true;
else
{
failureMessage = "Not all mechanical repairs for this vehicle are complete";
return false;
}
completeMechrepairsCountは、同じコンテキストのSetAllRepairsOfTypeToCompleteで更新された場合でも、常に0です。