发生的原因,在CheckProductionCode()方法中根据主键id查询对象时没有使用AsNoTracking(),示例:_db.Productions.AsNoTracking()
那么EF会把查询出的对象缓存并跟踪对象状态,之后再Update的时候就会查询现有已跟踪的对象,发现已经存在一个相同主键的对象,所以报错。
/// <summary> /// 编辑修改商品 /// </summary> /// <param name="dto"></param> /// <exception cref="Exception"></exception> public void EditProduction(Production dto) { bool res = CheckProductionCode(dto); if (!res) { throw new Exception("商品编码重复"); } _db.Productions.Update(dto); _db.SaveChanges(); }
CheckProductionCode
public bool CheckProductionCode(Production dto) { var res = _db.Productions.Where(x => x.ProductionId == dto.ProductionId).FirstOrDefault(); //.... return true; }
解决办法1:查询的时候禁用状态跟踪 _db.Productions.AsNoTracking()
解决办法2:在Program.cs中配置数据库的时候,设置所有查询禁用跟踪
// 使用 Pomelo.EntityFrameworkCore.MySql builder.Services.AddDbContext<DataMgrContext>(opt => { string connStr = builder.Configuration.GetConnectionString("MysqlContext") + ""; var serverVersion = ServerVersion.AutoDetect(connStr); opt.UseMySql(connStr, serverVersion); //重要,不跟踪查询得到的实体。 opt.UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking); });
标签:dto,tracked,xxx,db,查询,instance,CheckProductionCode From: https://www.cnblogs.com/xsj1989/p/18469788