这个是 ef core官方 自带 单字段 并发控制 为了解决 并发中 同时 修改 一条数据 产生的错误
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EF_Core07
{
internal class HouseConfig : IEntityTypeConfiguration<House>
{
public void Configure(EntityTypeBuilder<House> builder)
{
builder.ToTable("T_Houses");
//配置 需要 并发修改 的 单个 字段
builder.Property(e=>e.UserName).IsConcurrencyToken();
}
}
}
IsConcurrencyToken 命令
下面 例子 是 使用 场景
using Microsoft.EntityFrameworkCore;
namespace EF_Core07
{
internal class Program
{
static void Main(string[] args)
{
Console.WriteLine("请输入您的名字:");
string name = Console.ReadLine();
using (DBcontext db = new DBcontext())
{
House house = db.Houses.Single(e => e.Id == 6);
if (house.UserName == name)
{
Console.WriteLine("你自己已经抢到房子了");
Console.ReadKey();
return;
}
else if (house.UserName != null)
{
Console.WriteLine($"房子已经被{house.UserName}抢到了");
Console.ReadKey();
return;
}
house.UserName = name;
Thread.Sleep(6000);
//注意 下面的 try 是SaveChanges 产生的
//因为如果 并发同时 访问并且 修改。并发后 最先成功的一条,其他在做修改 就会产生异常
try
{
db.SaveChanges();
}
catch(DbUpdateConcurrencyException ex)
{
var entry = ex.Entries.First();
//在多 并发中 取出 最先 修改 成功的 记录
var dbVaule = entry.GetDatabaseValues().GetValue<string>(nameof(house.UserName));
Console.WriteLine($"并发冲突,房子被{house.UserName}抢走了");
}
Console.ReadKey();
}
}
}
}