You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 01:52:48