在现代Web应用和企业级系统中,多个用户同时操作同一数据的情况非常普遍。如果不加以控制,就可能导致数据覆盖或数据丢失的问题。这就是我们常说的并发冲突。本文将带你从零开始,深入浅出地掌握如何在EF Core(Entity Framework Core)中处理这类问题,即使是编程新手也能轻松上手!
假设你和同事同时编辑同一个客户信息:
如果没有并发控制机制,后保存的操作会直接覆盖前一个操作,导致一方的修改被悄悄丢弃——这就是典型的并发冲突。
EF Core 主要支持 乐观并发控制(Optimistic Concurrency),即默认允许多个用户同时读取和修改数据,但在提交时检查数据是否已被他人修改。如果检测到冲突,则抛出异常,由开发者决定如何处理。
这是最推荐的方式。在数据库表中添加一个 byte[] 类型的字段,并标记为 [Timestamp] 或使用 Fluent API 配置为并发令牌。
public class Customer{ public int Id { get; set; } public string Name { get; set; } = string.Empty; public string Email { get; set; } = string.Empty; public string Phone { get; set; } = string.Empty; [Timestamp] public byte[]? RowVersion { get; set; }} protected override void OnModelCreating(ModelBuilder modelBuilder){ modelBuilder.Entity<Customer>() .Property<byte[]>("RowVersion") .IsRowVersion();} 如果你不想用 RowVersion,也可以将任意属性(如 LastModified 时间)标记为并发令牌:
public class Product{ public int Id { get; set; } public string Name { get; set; } = string.Empty; [ConcurrencyCheck] public DateTime LastModified { get; set; }} 当 EF Core 检测到并发冲突时,会抛出 DbUpdateConcurrencyException 异常。你需要在保存数据时捕获它,并决定如何响应。
try{ await _context.SaveChangesAsync();}catch (DbUpdateConcurrencyException ex){ foreach (var entry in ex.Entries) { var proposedValues = entry.CurrentValues; var databaseValues = entry.GetDatabaseValues(); if (databaseValues == null) { // 数据已被删除 ModelState.AddModelError(string.Empty, "该记录已被其他用户删除。"); } else { // 可选择:自动合并、提示用户、或重试 // 这里简单地将数据库值重新加载 entry.OriginalValues.SetValues(databaseValues); entry.Property(nameof(Customer.RowVersion)).OriginalValue = databaseValues.GetValue<byte[]>(nameof(Customer.RowVersion)); // 重新尝试保存(可选) await _context.SaveChangesAsync(); } }} 在真实项目中,建议向用户展示冲突详情,让他们决定如何处理。例如:
这种交互方式能极大提升用户体验,避免数据意外丢失。
通过本文,你已经掌握了在 EF Core 中处理并发冲突的核心方法:
[Timestamp] 或 IsRowVersion() 启用乐观并发DbUpdateConcurrencyException 异常记住,良好的并发控制是构建可靠系统的基石。无论你是开发内部管理系统还是高并发的互联网应用,EF Core并发控制、Entity Framework Core并发冲突、乐观并发处理 和 .NET数据库并发 都是你必须掌握的关键技能。
希望这篇教程对你有帮助!动手试试吧,实践是最好的老师。
本文由主机测评网于2025-12-24发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://vpshk.cn/20251212100.html