修改设置了表与表之间外键记录时存在的坑

如果商品与货柜存在外键,比如:

public class Good{
        public long id{ get; set; }
        public string name{get;set;}
        public long CabinetId { get; set; }
        public Cabinet Cabinet { get; set; }
}    
public class cabinet{
    public long id{get;set;}
    public string name{get;set;}
    public List<good> list=new List<good>();
}

 

在修改某一商品记录时,可能存在2个坑,注意一下:

1、第一个坑,如果修改如下:

public async Task<IActionResult> AddGrid(Grid grid)
{
    。。。
  var modGrid=db.Grids.SingleOrDefault(x => x.Id == grid.Id);
  if (modGrid == null)
  {
      return Content("修改失败!原因:记录不存在");
  }
  db.Update(grid);

await db.SaveChangesAsync();
}

在执行上面代码 时会报错

The instance of entity type ‘***‘ cannot be tracked because another instance with the same key value for {‘ID‘} is already being tracked. When attaching existing entities, ensure that only one entity instance with a given key value is attached. Consider using ‘***’ to see the conflicting key values.

解决办法 :modGrid查找时不要跟踪

  var modGrid=db.Grids.AsNoTracking().SingleOrDefault(x => x.Id == grid.Id);

 

2、第二个坑,按上面修改成功后发现,外键怎么修改都不成功,也就是明明修改了外键值,但浏览时发现还是没有变,原来在controller获取商品grid时,系统已自动映射了外键类Cabinet,这时虽然CabinetId值时修改了,但Cabinet还是原因的,所以save后还没有改变。

解决办法:让Cabinet=null,再save就Ok了

grid.Cabinet = null;
db.Update(grid);

 

上一篇:使用SQLAlchemy进行ORM操作


下一篇:I/O密集型任务下,单线程、多进程、多线程、协程