[英]Why is Entity Framework trying to update more than one row when I save my changes?
我有下面的方法,当保存更改运行时,实体框架尝试更新多行? 即使我只修改一条记录上的日期并获取一条记录进行修改。
错误
Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException:数据库操作预计会影响 1 行,但实际上影响了 2 行。 自加载实体以来,数据可能已被修改或删除。
方法
public static async Task<HttpResult> PostRecordCoworkerStartDateAsync(MpidDbContext context, int id, RecordCoworker recordCoworker)
{
// just testing to see how many are returned
int testCount = context.RecordsCoworkers.Where(m => m.Id == id && m.IsActive == true).ToList().Count();
RecordCoworker recordCoworkerToUpdate = context.RecordsCoworkers.SingleOrDefault(m => m.Id == id && m.IsActive == true);
recordCoworkerToUpdate.StartDate = recordCoworker.StartDate;
try
{
await context.SaveChangesAsync();
} catch(Exception ex)
{
var i = ex;
}
return HttpResult.NoContent;
}
不知何故,当查询运行时,它会删除需要正确更新的参数,例如。 'IsActive' 字段。 我已经捕获了下面的查询。
SET NOCOUNT ON;
UPDATE [Records_Coworkers] SET [StartDate] = @p0
WHERE [RecordID] = @p1 AND [CoworkerID] = @p2;
SELECT @@ROWCOUNT;
基本上,我只想更新“IsActive”为真的记录。 但是查询,因为它剥离了“IsActive”属性,将尝试更新两行或更多行。
简单解释一下原因:
SaveChanges
以向 EF 发送信号,表明它将更改发送回数据库。 这是两个操作: SELECT
和UPDATE
。 这些是单独执行的,因为 Entity Framework 不知道:您在此期间(直到您调用SaveChanges
)对实体做了什么?
将[ConcurrencyCheck]
分配给属性告诉实体框架它应该确保在UPDATE
,属性IsActive
的值应该与SELECT
期间相同。 当有不同的应用程序写入该数据库时,这可确保在SELECT
和UPDATE
之间没有其他应用程序更改实体。
您应该删除int testCount
行。 或者将它们请求为 Untracked。
我发现了原因。
在我的实体中,我需要向“IsActive”属性添加一个数据属性
[Required]
[ConcurrencyCheck]
public bool IsActive { get; set; }
在我的情况下,错误是由于没有真正的 ID 列引起的。
我认为是 ID - 并在实体框架中使用 [Key] 属性配置 - 在数据库中有重复,所以即使我用它来过滤我更新了多行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.