do
{
using (var context2 = new OA_DbContext())
using (var context = new OA_DbContext())
{
var user = context.Warehouse.SingleOrDefault(x => x.ProductId == 1 && x.StoreId == 4);
var user2 = context2.Warehouse.SingleOrDefault(x => x.ProductId == 1 && x.StoreId == 4);
user.SellStock = 99;
// context.Entry(user).State = EntityState.Modified;
context.SaveChanges();
bool saveFailed;
saveFailed = false;
user2.SellStock = 2;
try
{
// context2.Entry(user2).State = EntityState.Modified;
context2.SaveChanges();
}
catch (DbUpdateConcurrencyException ex)
{
saveFailed = true;
ex.Entries.Single().Reload();
获取并发异常被追踪的实体
//var tracking = ex.Entries.Single();
获取数据库原始值对象,数据库中没被修改之前的值
//var original = (SalesPlan_Warehouse)tracking.OriginalValues.ToObject(); Console.WriteLine(original.SellStock); // 小新
// // 获取更新后数据库最新的值对象,就是数据库中目前的值,这一句会发起查询
//var database = (SalesPlan_Warehouse)tracking.GetDatabaseValues().ToObject(); Console.WriteLine(database.SellStock); // 小新11
// // 获取当前内存的值,就是造成并发异常的值
//var current = (SalesPlan_Warehouse)tracking.CurrentValues.ToObject(); Console.WriteLine(current.SellStock); // 小新22
//tracking.OriginalValues.SetValues(database);
tracking.GetDatabaseValues().SetValues(current);
//context2.SaveChanges(); // 需要调用savechanges方法
//throw ex;
}
catch (DbUpdateException ex)
{
Console.WriteLine(
$"线程:{Thread.CurrentThread.ManagedThreadId}:异常,为了保证可重复读,你的修改提交失败,请稍后重试--{DateTime.Now.ToString("HH:mm:ss fff")}");
}
}
} while (saveFailed);
public class OA_DbContext : DbContext
{
public OA_DbContext()
: base("name=Entities")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
//modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
//modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();
// modelBuilder.Entity<SalesPlan_Warehouse>().Property(p => p.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
//modelBuilder.Entity<SalesPlan_Warehouse>().Property(p => p.RowVersion).IsConcurrencyToken().HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
modelBuilder.Entity<Warehouse>().Property(x => x.RowVersion).IsRowVersion();
//base.OnModelCreating(builder);
}
}