Entity Framework Core中如何避免保存子级VehicleOrders记录?
问题:保存Vehicle时误修改VehicleOrders表,
[NotMapped]特性无效求解决方案 在当前架构下,保存Vehicle实体时会影响到VehicleOrders表,这是预期外的行为。已尝试使用[NotMapped]特性标记相关集合,但未生效,寻求其他解决办法。
相关代码
Vehicle类定义
[NotMapped] public ICollection<VehicleOrder> VehicleOrders { get; set; } [NotMapped] public ICollection<VehicleOrder> VehicleOrders1 { get; set; }
UpdateVehicle更新方法
public async Task<RadzenBlazorServerApp.Models.sql_database.Vehicle> UpdateVehicle(int id, RadzenBlazorServerApp.Models.sql_database.Vehicle vehicle) { OnVehicleUpdated(vehicle); var itemToUpdate = Context.Vehicles .Where(i => i.Id == vehicle.Id) .FirstOrDefault(); if (itemToUpdate == null) { throw new Exception("Item no longer available"); } var entryToUpdate = Context.Entry(itemToUpdate); entryToUpdate.CurrentValues.SetValues(vehicle); entryToUpdate.State = EntityState.Modified; Context.SaveChanges(); OnAfterVehicleUpdated(vehicle); return vehicle; }
架构示意图

更新说明
- 代码由Radzen Blazor Studio自动生成,当前为Blazor Server应用,
OnVehicleUpdated和OnAfterVehicleUpdated仅为存根,无实际逻辑。 - 执行
var isSameReference = object.ReferenceEquals(itemToUpdate, vehicle);结果为true,说明传入的vehicle实体已被DbContext加载或附加,代码可简化为:
public async Task<RadzenBlazorServerApp.Models.sql_database.Vehicle> UpdateVehicle(int id, RadzenBlazorServerApp.Models.sql_database.Vehicle vehicle) { Context.SaveChanges(); return vehicle; }
- 项目中存在一个
Reset()方法可分离所有实体:
public void Reset() => Context.ChangeTracker.Entries().Where(e => e.Entity != null).ToList().ForEach(e => e.State = EntityState.Detached);
添加该方法调用后,引用检查结果变为false,验证了实体已被附加的推测。
- 为保留自动生成代码的结构,在
UpdateVehicle方法顶部添加Reset()调用:
public async Task<RadzenBlazorServerApp.Models.sql_database.Vehicle> UpdateVehicle(int id, RadzenBlazorServerApp.Models.sql_database.Vehicle vehicle) { OnVehicleUpdated(vehicle); Reset(); var itemToUpdate = Context.Vehicles .Where(i => i.Id == vehicle.Id) .FirstOrDefault(); if (itemToUpdate == null) { throw new Exception("Item no longer available"); } var entryToUpdate = Context.Entry(itemToUpdate); entryToUpdate.CurrentValues.SetValues(vehicle); entryToUpdate.State = EntityState.Modified; Context.SaveChanges(); OnAfterVehicleUpdated(vehicle); return vehicle; }
- 问题根因:打开车辆详情(钻取功能)时,实体被附加到DbContext,导致更新操作误修改VehicleOrders表,推测是因为该表存在多条同一Vehicle的引用,引发数据混乱。
内容的提问来源于stack exchange,提问作者AZ Chad
相关产品推荐
相关产品推荐

