下面是一个使用Entity Framework Core进行并发操作和事务的示例代码:
using System;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
public class Program
{
public static async Task Main(string[] args)
{
var options = new DbContextOptionsBuilder()
.UseSqlServer("Your_Connection_String")
.Options;
using (var context = new AppDbContext(options))
{
await context.Database.EnsureCreatedAsync();
// 创建两个并发任务
var task1 = UpdateEntityAsync(context);
var task2 = UpdateEntityAsync(context);
await Task.WhenAll(task1, task2);
}
}
public static async Task UpdateEntityAsync(AppDbContext context)
{
using (var transaction = await context.Database.BeginTransactionAsync())
{
try
{
var entity = await context.Entities.FirstOrDefaultAsync();
entity.Value++; // 假设这是需要并发更新的字段
await context.SaveChangesAsync();
await transaction.CommitAsync();
}
catch
{
await transaction.RollbackAsync();
throw;
}
}
}
}
public class AppDbContext : DbContext
{
public DbSet Entities { get; set; }
public AppDbContext(DbContextOptions options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity().HasData(new Entity { Id = 1, Value = 0 });
}
}
public class Entity
{
public int Id { get; set; }
public int Value { get; set; }
}
上面的代码创建了一个AppDbContext
,其中包含一个Entities
集合表示需要进行并发更新的实体。UpdateEntityAsync
方法是一个并发任务,它在事务中更新实体的值并保存更改。
在Main
方法中,我们创建了两个并发任务,并使用Task.WhenAll
等待它们完成。在UpdateEntityAsync
方法中,我们使用context.Database.BeginTransactionAsync
开始一个事务,并在更新和保存更改后使用transaction.CommitAsync
提交事务。
注意:在实际应用程序中,请根据你的数据库提供程序和需求对代码进行相应的修改和调整。