HTML5技术

EntityFramework Core并发深挖详解,一纸长文,你准备好看完了吗? - Jeffcky(5)

字号+ 作者:H5之家 来源:H5之家 2017-04-05 14:03 我要评论( )

readerWriter1.Commit(() = { blog1.Name = nameof(readerWriter1);blog1.Count = 3 ; });Console.WriteLine($ );Console.WriteLine( );readerWriter2.Commit(change: () = { blog2.Name = nameof(readerWriter2);b

readerWriter1.Commit(() => { blog1.Name = nameof(readerWriter1); blog1.Count = 3; }); Console.WriteLine($); Console.WriteLine(); readerWriter2.Commit( change: () => { blog2.Name = nameof(readerWriter2); blog2.Count = 4; blog2.Url = "http://www.cnblogs.com/CreateMyself"; }.......

为了便于阅读者观察和对比,我们给出数据库中默认的初始值,如下:

好了到了这里关于EF Core中并发内容算是全部结束,别着急,还剩下最后一点内容,那就是终极解决并发方案,请继续往下看。

EntityFramework Core并发高级终极版解决方案

我们定义一个名为 RefreshConflict 枚举,当提交时定义是否为数据库或者客户端或者数据库和客户端数据合并:

public enum RefreshConflict { StoreWins, ClientWins, MergeClientAndStore }

根据上述不同的获胜模式来刷新数据库中的值,我们定义如下刷新状态扩展方法:

RefreshEFStateExtensions { public static EntityEntry Refresh(this EntityEntry tracking, RefreshConflict refreshMode) { switch (refreshMode) { case RefreshConflict.StoreWins: { //当实体被删除时,重新加载设置追踪状态为Detached //当实体被更新时,重新加载设置追踪状态为Unchanged tracking.Reload(); break; } case RefreshConflict.ClientWins: { PropertyValues databaseValues = tracking.GetDatabaseValues(); if (databaseValues == null) { //当实体被删除时,设置追踪状态为Detached,当然此时客户端无所谓获胜 tracking.State = EntityState.Detached; } else { //当实体被更新时,刷新数据库原始值 tracking.OriginalValues.SetValues(databaseValues); } break; } case RefreshConflict.MergeClientAndStore: { PropertyValues databaseValues = tracking.GetDatabaseValues(); if (databaseValues == null) { /*当实体被删除时,设置追踪状态为Detached,当然此时客户端没有合并的数据 并设置追踪状态为Detached */ tracking.State = EntityState.Detached; } else { //当实体被更新时,刷新数据库原始值 PropertyValues originalValues = tracking.OriginalValues.Clone(); tracking.OriginalValues.SetValues(databaseValues); SelfDefine databaseValues.PropertyNames // Navigation properties are not included. .Where(property => !object.Equals(originalValues[property], databaseValues[property])) .ForEach(property => tracking.Property(property).IsModified = false); #else databaseValues.Properties .Where(property => !object.Equals(originalValues[property.Name], databaseValues[property.Name])) .ToList() .ForEach(property => tracking.Property(property.Name).IsModified = false); #endif } break; } } return tracking; } }

默认重试机制采取自定义重试三次:

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • EntityFramework Core不得不注意的性能优化意外收获,你会用错? - Jeffcky

    EntityFramework Core不得不注意的性能优化意外收获,你会用错? - J

    2017-04-05 14:00

  • ASP.NET Core MVC 源码学习:详解 Action 的匹配 - Savorboard

    ASP.NET Core MVC 源码学习:详解 Action 的匹配 - Savorboard

    2017-03-30 18:02

  • ASP.NET Core MVC 源码学习:MVC 启动流程详解 - Savorboard

    ASP.NET Core MVC 源码学习:MVC 启动流程详解 - Savorboard

    2017-03-27 18:01

  • 一份关于组建.NET Core开源团队的倡议书 - 彭泽0902

    一份关于组建.NET Core开源团队的倡议书 - 彭泽0902

    2017-03-13 17:02

网友点评