您好我在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中更新。
答案 0 :(得分:0)
这应该原则上有效。我甚至创建了一个模仿这种行为的本地测试,它对我有用。我认为最可能的原因是:(任何/所有)
1)您的SetAllRepairsOfTypeToComplete方法没有更新您认为的对象。
-OR -
2)您获取已完成的建议书计数的查询未获取正确的对象。
尝试进行一些调试,其中您的EFRepair对象具有唯一ID,您可以使用该ID来查看它是否得到更新。然后从completedMechrepairs检查中获取List,并查看具有该ID的EFRepair对象是否在列表中。