在保存更改之前,EF4看不到上下文的更改

时间:2012-12-13 16:47:11

标签: c# entity-framework c#-4.0 orm

您好我在EF4环境中使用工作单元格式。

上下文通过一些方法传递,所有方法都可以对它进行操作,然后在完成后调用save更改。

当我稍后检查对象的状态时,旧的值不是新的。但如果我在那时调用保存更改,我希望在上下文中看到的状态将保存到数据库中。

基本上调用堆栈是

Context ctx;

UpdateItems(ctx);
CheckItemsValid(ctx);
DoSomehtingElse(ctx); //Saving changes here.

现在CheckItemsValid失败了,因为它无法看到UpdateItems中所做的更改,但它是相同的上下文。

如果我将整个事物包装在TransactionScope中并在调用检查项之前调用SaveChanges,那么所有工作似乎都是一个大锤来破解坚果。

更新更新项目方法中的项目后,我尝试了以下操作。

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();         
            }

是processvehicle调用检查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;
        }

completedMechrepairsCount始终为0,即使它们在同一上下文中的SetAllRepairsOfTypeToComplete中更新。

1 个答案:

答案 0 :(得分:0)

这应该原则上有效。我甚至创建了一个模仿这种行为的本地测试,它对我有用。我认为最可能的原因是:(任何/所有)

1)您的SetAllRepairsOfTypeToComplete方法没有更新您认为的对象。

-OR -

2)您获取已完成的建议书计数的查询未获取正确的对象。

尝试进行一些调试,其中您的EFRepair对象具有唯一ID,您可以使用该ID来查看它是否得到更新。然后从completedMechrepairs检查中获取List,并查看具有该ID的EFRepair对象是否在列表中。