我想更新EF中的一行:
Case newCase = new Case(...);
dbContext.Entry(newCase).State = EntityState.Modified;
dbContext.SaveChanges();
更新时我收到此消息:
数据库操作预计会影响1行但实际上会影响0 行(S)。自实体以来,数据可能已被修改或删除 装载
没有并发性,因为我在我的机器上使用db。
如果我转到SQL分析器以查看执行的查询,则条件为:
WHERE [Id] = @p0 AND [RowVersion] = @p14;
在这种情况下,@p0
为1且@p14
为NULL,与我想要修改的记录完全相同。但是,如果我在删除查询的RowVersion
部分后在SQL Server中手动启动此查询,则会成功,更新1行。
可能是什么问题,我该如何解决?
编辑:
我尝试在更新之前选择记录,但错误是相同的:
IEnumerable<Case> cases = from c in dbContext.Cases where c.Id.ToString() == "1" select c;
Case cs = cases.SingleOrDefault();
dbContext.Entry(cs).State = EntityState.Modified;
dbContext.SaveChanges();
以下是完整错误:
类型的例外 发生了'Microsoft.Data.Entity.DbUpdateConcurrencyException' EntityFramework.Core.dll但未在用户代码中处理
其他信息:预计会影响1行的数据库操作 但实际上影响了0行。数据可能已被修改或删除 因为实体已加载。看到 http://go.microsoft.com/fwlink/?LinkId=527962了解有关的信息 理解和处理乐观并发异常。
这是来自Sql Profiler的查询:
exec sp_executesql N'SET NOCOUNT OFF;
UPDATE [Case]
SET
[Closed] = @p1
, [Comment] = @p2
, [ContactComment] = @p3
, [ContactId] = @p4
, [CreatedBy] = @p5
, [CreatedDateTime] = @p6
, [Description] = @p7
, [Email] = @p8
, [LastModifiedBy] = @p9
, [LastModifiedDateTime] = @p10
, [OpenedDateTime] = @p11
, [Phone] = @p12
, [RowVersion] = @p13
, [SlaConsumedTime] = @p15
, [SlaSuspended] = @p16
, [SlaTotalTime] = @p17
, [Status] = @p18
, [Title] = @p19
WHERE
[Id] = @p0
AND [RowVersion] = @p14;
SELECT @@ROWCOUNT;',
N'@p0 int,@p1 bit,@p2 nvarchar(max) ,@p3 nvarchar(max) ,@p4 int,@p5 int,@p6 datetime2(7),
@p7 nvarchar(4000),@p8 nvarchar(4000),@p9 int,@p10 datetime2(7),@p11 datetime2(7),
@p12 nvarchar(max) ,@p13 varbinary(max) ,@p14 varbinary(max) ,@p15 time(7),@p16 bit,
@p17 time(7),@p18 int,@p19 nvarchar(4000)',
@p0=1,@p1=0,@p2=NULL,@p3=NULL,@p4=0,@p5=1,@p6='2015-09-23 09:07:55.7041023',@p7=N'y',
@p8=N't@f.f',@p9=1,@p10='2015-09-23 09:50:02.9934006',@p11='2015-09-23 09:07:55.6796028',
@p12=NULL,@p13=NULL,@p14=NULL,@p15='00:00:00',@p16=0,@p17='00:00:00',
@p18=0,@p19=N'y'
答案 0 :(得分:1)
由于主键为Null
的{{1}}值。
LinQ
检查您的对象,是否通过主键Case newCase = new Case(...);
dbContext.Entry(newCase).State = EntityState.Modified;
dbContext.SaveChanges();
。这种例外通常只是由于这个原因。
答案 1 :(得分:0)
您实体的主键字段表示未设置ID ..表示它为零。当您尝试更新记录时,其ID键应设置值,ID和更新将起作用。您的更新代码没问题。
答案 2 :(得分:0)
我的表带有复合主键:
DbUpdateConcurrencyException: 'Database operation expected to affect 1 row(s) but actually affected 0 row(s). Data may have been modified or deleted since entities were loaded.
当我尝试使用Key2 = 0插入新行时,它失败,并出现相同的错误。
[Authorize]
我的解决方案是避免保存0 作为键值。它似乎被视为NULL,并且不能成为有效主键的一部分。 希望这可以节省别人的时间。
答案 3 :(得分:0)
就我而言,我用SQL创建了一个新表,没有任何迁移或任何操作。我忘记将id
字段设置为primary key
和identity(1,1)
。一旦将其放置到位,就不再节省任何问题。
答案 4 :(得分:0)
就我而言,我删除了相关表并保存了它,因此出现错误。我更改了它并首先删除了两个表,然后保存了它们。