Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么实体框架在保存更改时尝试更新多行?_C#_Entity Framework_Vue.js_Asp.net Core_Entity Framework Core - Fatal编程技术网

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

C# 为什么实体框架在保存更改时尝试更新多行?,c#,entity-framework,vue.js,asp.net-core,entity-framework-core,C#,Entity Framework,Vue.js,Asp.net Core,Entity Framework Core,我有下面的方法,当运行保存更改时,实体框架会尝试更新多行吗?即使我只是修改一条记录上的日期,并获取一条记录进行修改 错误 Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException:数据库操作预期影响1行,但实际影响2行。自加载实体后,数据可能已被修改或删除 方法 public static async Task<HttpResult> PostRecordCoworkerStartDateAsync(MpidDbCo

我有下面的方法,当运行保存更改时,实体框架会尝试更新多行吗?即使我只是修改一条记录上的日期,并获取一条记录进行修改

错误

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'为真。但是查询会尝试更新两行或更多行,因为它去掉了'IsActive'属性。

我找到了原因

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

    [Required]
    [ConcurrencyCheck]
    public bool IsActive { get; set; }
我找到了原因

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

    [Required]
    [ConcurrencyCheck]
    public bool IsActive { get; set; }
我只是想解释一下原因:

您向数据库询问具有特定id的所有活动用户,并获取第一个结果。 实体框架发送请求并将结果具体化为对象。 您可以更改属性。 实体框架将对象的状态设置为已更改。 您可以调用SaveChanges来通知EF它将更改发送回数据库。 由于已知对象具有哪个id,因此在update语句中直接对其进行寻址。 这是两个操作:选择和更新。这些都是单独执行的,因为实体框架不知道:在调用实体的SaveChanges之前,您在此期间要做什么

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

您应该删除int testCount行。或者要求他们未经跟踪。

只是为了解释原因:

您向数据库询问具有特定id的所有活动用户,并获取第一个结果。 实体框架发送请求并将结果具体化为对象。 您可以更改属性。 实体框架将对象的状态设置为已更改。 您可以调用SaveChanges来通知EF它将更改发送回数据库。 由于已知对象具有哪个id,因此在update语句中直接对其进行寻址。 这是两个操作:选择和更新。这些都是单独执行的,因为实体框架不知道:在调用实体的SaveChanges之前,您在此期间要做什么

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


您应该删除int testCount行。或者请求它们为未跟踪。

在我的例子中,错误是由于没有真实的ID列造成的


我认为是一个ID,并在实体框架中配置了[Key]属性,但数据库中有重复项,因此即使在我使用它进行筛选时,我也更新了多行。

在我的例子中,错误是由于没有真正的ID列造成的

我认为是一个ID,并在实体框架中配置了[Key]属性,但数据库中有重复项,所以即使在我使用它进行筛选时,我也更新了多行