我正在具有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行。数据 自加载实体以来,可能已被修改或删除
我尝试对代码进行了许多修改,包括
ctx.Attach(门票);
但这无济于事。
如何获取它以成功更新数据库? 关于如何调试的任何想法?日志似乎很难设置。
任何想法都很感激。
答案 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的回答)
这不是完美的答案,但为我解决了。