C# 为什么实体框架在保存更改时尝试更新多行?
我有下面的方法,当运行保存更改时,实体框架会尝试更新多行吗?即使我只是修改一条记录上的日期,并获取一条记录进行修改 错误 Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException:数据库操作预期影响1行,但实际影响2行。自加载实体后,数据可能已被修改或删除 方法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
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]属性,但数据库中有重复项,所以即使在我使用它进行筛选时,我也更新了多行