【问题标题】:Entity Framework Core: Database operation expected to affect 1 row(s) but actually affected 0 row(s) [duplicate]实体框架核心:数据库操作预计会影响 1 行,但实际上影响了 0 行 [重复]
【发布时间】:2018-12-07 19:57:34
【问题描述】:

我在带有 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,错误通常发生在我第二次尝试更新任何票证(即任何其他票证 - 它似乎出现在第二次和后续请求中)时。
  • 更新出人意料地成功了!有时我可以更新另一张票并且它通过(即使在第三次或后续请求中)
  • 我尝试了对代码的一些修改,包括

    ctx.Attach(票证);

但这无济于事。

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

非常感谢任何想法。

【问题讨论】:

  • 在我的情况下,我使用了批量删除的扩展,导致错误。

标签: entity-framework-core-2.1


【解决方案1】:

对我来说,我犯了两个愚蠢的错误。首先,我尝试在不指定 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;
    }

【讨论】:

  • 是的,请确保您先拉动。这个抓了我太多次了。
  • 阅读 docs.microsoft.com/en-us/ef/core/saving/… 如果 Update() 给您带来问题。对我来说,我读到 Update 基本上是 AddOrUpdate 但它有一些例外。
【解决方案2】:

也遇到过这样的问题,但原因是我使用的触发器。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多