威势网络,为您的企业和团队注入互联网活力!
服务热线:138-9741-0341

The instance of entity type 'XXX' cannot be tracked because another insta....

发布日期:2022/10/6 作者: 浏览:950

EF同时打开两个实例,

     public  IActionResult Client(Client client)
        {

        var client_temp = _ConfigurationDbContext.Clients.Include(i => i.AllowedGrantTypes).Where(c => c.Id==client.Id).FirstOrDefault();

         .....
        }

    看以上代码,前台模型绑定时提交了一个Client实例,我们又用代码自己从数据库中创建了一个实例client_temp ,这样,EF就同时跟踪维护着两个一模一样的实例,当我们对Client进行编辑后,再保存,EF就抛出异常:

System.InvalidOperationException:“The instance of entity type 'Client' 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 

    这时候,我们只需要改一下代码,告诉EF,不要跟踪我们自己创建的client_temp 即可,用以下写法:

var client_temp = _ConfigurationDbContext.Clients.AsNoTracking().Include(i => i.AllowedGrantTypes).Where(c => c.Id==client.Id).FirstOrDefault();

//注意AsNoTracking()的用法,可以使EF框架只跟踪一个实例,

然后再保存就不报错了。

   其实我们也可以用另一种方法去解决这个问题,前面的代码创建了两个数据库实例,一个是前台提交过来的,另一个是我们自己手动从数据库中拉去的,我们对前台提交过来的模型进行修改的保存,对数据库拉取的置之不理,就报了上面的错误,其实我们可以对数据库中拉取的client_temp 进行修改去保存,而对前台提交过来,模型自动绑定的Client进行丢弃,这样就不会报上面的错了。



下拉加载更多评论
最新评论
暂无!