实体框架核心:数据库操作预计会影响1行,但实际上会影响0行

时间:2018-12-07 19:57:34

标签: entity-framework-core-2.1

我正在具有EC Core(2.1.0-preview1-final)的Linux上使用Sql Server

我正在尝试更新一些来自Web Api服务(PUT)请求的数据。数据(票证)正确传递并反序列化为对象(票证)。

当我尝试更新时,我使用以下代码:

public Ticket UpdateTicket(Ticket ticket)
        {
            using (var ctx = new SupportTicketContext(_connectionString))
            {
                ctx.Entry(ticket).State = EntityState.Modified;
                ctx.SaveChanges(); // <== **BLOWS UP HERE**
                var result = ctx.Tickets
                    .First(t => t.TicketId == ticket.TicketId);
                return result;

            }
        }

代码抛出以下错误:

数据库操作预期会影响1行,但实际上影响0行。数据 自加载实体以来,可能已被修改或删除

  • 我能够从数据库中插入和提取数据,没问题。
  • 如果我重新启动Visual Studio,则该错误通常在我第二次尝试更新ANY票证(即任何其他ticketId-似乎在第二个及后续请求中)时发生。
  • 更新异常成功!有时我可以更新另一张票证,并且该票证可以通过(即使在第三次或后续请求时)
  • 我尝试对代码进行了许多修改,包括

    ctx.Attach(门票);

但这无济于事。

如何获取它以成功更新数据库? 关于如何调试的任何想法?日志似乎很难设置。

任何想法都很感激。

3 个答案:

答案 0 :(得分:3)

对我来说,我犯了两个愚蠢的错误。首先,我尝试在不指定DbSet的情况下调用Update()方法:

_applicationDbContext.Update(user);

正确的方法:

_applicationDbContext.Users.Update(user);

第二个同样愚蠢的错误,是试图更新一个模型,而没有首先从数据库中提取它:

    public bool UpdateUser(IdentityUser model)
    {
        _applicationDbContext.Users.Update(model);
        _applicationDbContext.SaveChanges();

        return true;
    }

不。

我首先需要从数据库中检索它,然后对其进行更新:

    public bool UpdateUser(IdentityUser model)
    {
        var user = _applicationDbContext.Users.FirstOrDefault(u => u.Id == model.Id);

        user.PhoneNumberConfirmed = model.PhoneNumberConfirmed;

        _applicationDbContext.Users.Update(user);
        _applicationDbContext.SaveChanges();

        return true;
    }

答案 1 :(得分:1)

也有这样的问题,但是原因是我正在使用触发器。

将触发器类型从“插入插入”更改为“插入后”,而不是修改和插入数据,而是允许命令将数据插入表中,然后使用触发器进行更新。

答案 2 :(得分:0)

在这里查看:Unable to edit db entries using EFCore, EntityState.Modified: "Database operation expected to affect 1 row(s) but actually affected 0 row(s)."(请参见Haktan EnesBiçer的回答)

这不是完美的答案,但为我解决了。