无法更新EF6中的实体?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法更新EF6中的实体?相关的知识,希望对你有一定的参考价值。

我无法更新实体。下面是我用来更新实体的代码。它第一次更新时工作。但它下次失败了。

通用方法

 public TEntity Update(TEntity entity)
            {
                _context.Entry(entity).State = EntityState.Modified;
                _context.SaveChanges();
                return entity;
            }

调节器

 public IHttpActionResult Put(Invoice invoice)
        {
            return Ok(invoiceService.UpdateInvoice(invoice));
        }

服务

  public Invoice UpdateInvoice(Invoice invoice)
        {
            return _repo.Update(invoice);
        }

即将发生的错误。

System.InvalidOperationException:'附加类型为'Models.Invoice'的实体失败,因为同一类型的另一个实体已具有相同的主键值。如果图中的任何实体具有冲突的键值,则在使用“附加”方法或将实体的状态设置为“未更改”或“已修改”时,可能会发生这种情况。这可能是因为某些实体是新的并且尚未收到数据库生成的键值。在这种情况下,使用“添加”方法或“已添加”实体状态来跟踪图表,然后根据需要将非新实体的状态设置为“未更改”或“已修改”。

更新:请参阅下面的答案。

答案

它看起来你没有共享所有必要的代码。但解决方案如下。你的方法正在采取一些行动,并期望返回一些导致问题的价值。

这里要解决这个问题,你需要在Try catch块中包含代码并处理这个异常。

try{
//your code
}
catch(InvalidOperationException){
//you may keep this section blank.
}
另一答案

它可能不是最好的解决方案。但对于遇到此问题的任何人,我通过重新初始化上下文来解决它,因为它没有认识到实体已经可用。 (由id)

        public TEntity Update(TEntity entity)
                    {
                        _context = new DbContex();
                        _context.Entry(entity).State = EntityState.Modified;
                        _context.SaveChanges();
                        return entity;
                    }

以上是关于无法更新EF6中的实体?的主要内容,如果未能解决你的问题,请参考以下文章

EF6 无法插入重复的键行

EF6 无法将分离的实体附加到上下文

如何仅保存/更新父实体而不将其子实体保存在 asp.net mvc 的 EF6 中?

EF6:代码优先复杂类型

实体类型 MVC5 EF6 中的用户

无法更新FragmentPagerAdapter中的片段