繁体   English   中英

为什么实体框架在我保存更改时尝试更新多行?

[英]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”属性,将尝试更新两行或更多行。

简单解释一下原因:

  1. 您向数据库询问具有特定 id 的所有活动用户并获取第一个结果。
  2. 实体框架发送请求并将结果具体化为一个对象。
  3. 您更改属性。
  4. 实体框架会将对象的状态设置为已更改。
  5. 您调用SaveChanges以向 EF 发送信号,表明它将更改发送回数据库。
  6. 由于知道对象具有哪个 id,它直接在更新语句中寻址。

这是两个操作: SELECTUPDATE 这些是单独执行的,因为 Entity Framework 不知道:您在此期间(直到您调用SaveChanges )对实体做了什么?

[ConcurrencyCheck]分配给属性告诉实体框架它应该确保在UPDATE ,属性IsActive的值应该与SELECT期间相同。 当有不同的应用程序写入该数据库时,这可确保在SELECTUPDATE之间没有其他应用程序更改实体。

您应该删除int testCount行。 或者将它们请求为 Untracked。

我发现了原因。

在我的实体中,我需要向“IsActive”属性添加一个数据属性

    [Required]
    [ConcurrencyCheck]
    public bool IsActive { get; set; }

在我的情况下,错误是由于没有真正的 ID 列引起的。

我认为是 ID - 并在实体框架中使用 [Key] 属性配置 - 在数据库中有重复,所以即使我用它来过滤我更新了多行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM