【发布时间】:2012-12-13 16:47:10
【问题描述】:
您好,我在 EF4 上下文中使用工作单元模式。
上下文通过几个方法传递,所有方法都在它上面工作,然后在完成后我调用保存更改。
当我稍后对对象的状态进行检查时,它是旧值而不是新值。但是,如果我此时调用保存更改,我希望在上下文中看到的状态将保存到数据库中。
本质上调用堆栈是
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();
}
流程车辆调用检查 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 中进行了更新。
【问题讨论】:
-
你能发布一些代码让我们继续吗?
-
@jmrnet 已更新以显示相关过程。
-
好的。 ProcessVehicle 中的检查如何检查“成功”?你能告诉我那个代码吗?
-
@jmrnet 添加了检查代码忽略了机械消息它只是复制和粘贴尚未修复的内容:)
标签: c# entity-framework c#-4.0 orm