【问题标题】:Entity Framework Core - What happens to tracked records if CRUD operations are done directly at the database?Entity Framework Core - 如果直接在数据库中完成 CRUD 操作,跟踪记录会发生什么情况?
【发布时间】:2021-01-20 12:22:02
【问题描述】:

在阅读 EF Core 文档时,我了解到更改跟踪的工作原理类似于跟踪实体的缓存。我开始意识到我的一些数据库管理员喜欢直接对数据库运行添加/更新/删除操作。如果他们这样做,我的跟踪实体还会发生什么?我有一种预感,这些被跟踪的实体将与数据库不同步,但我还没有确认。

【问题讨论】:

  • 没什么!所以是的,除非你让 EF Core 再次读取数据库,否则它们会不同步

标签: c# sql-server asp.net-core .net-core entity-framework-core


【解决方案1】:

EF 默认使用乐观并发并且(据我所知)不支持悲观并发(目前)。在乐观的情况下...最后保存的记录获胜。

您需要进行异常检查并重新加载数据。

为了更新..

try
{
   dbContext.SaveChanges();
}
catch (DbUpdateConcurrencyException ex)
{
    ex.Entries.Single().Reload();
    dbContext.SaveChanges();
}

处理删除...

try
{
     dbContext.SaveChanges();
}
catch (DbUpdateConcurrencyException ex)
{
   var entity = ex.Entries.Single().GetDatabaseValues();
   if (entity == null)
   {
         // Already deleted
   }
}

还有并发标记 [ConcurrencyCheck],[TimeStamp]... 属性属性用于实现乐观并发。

https://docs.microsoft.com/en-us/ef/core/modeling/concurrency?tabs=data-annotations

【讨论】:

    猜你喜欢
    • 2021-08-28
    • 1970-01-01
    • 2022-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多