2

こんにちは私は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です。

4

1 に答える 1

0

これは原則として機能するはずです。私はこの振る舞いを模倣するローカルテストを作成しました、そしてそれは私のために働きました。最も可能性の高い原因は次のとおりだと思います:(いずれか/すべて)

1)SetAllRepairsOfTypeToCompleteメソッドが、想定しているオブジェクトを更新していません。

-また-

2)completedMechrepairsカウントを取得するためのクエリが、正しいオブジェクトを取得していません。

EFRepairオブジェクトに一意のIDがあり、それが更新されるかどうかを確認するために使用できるデバッグを実行してみてください。次に、completedMechrepairsチェックからリストを取得し、そのIDを持つEFRepairオブジェクトがリストに含まれているかどうかを確認します。

于 2012-12-13T17:56:44.437 に答える