OptimisticConcurrencyUsingEntityFrameworkandMySQL我目前正在使用EntityFramework4.1和MySQL开发一个应用程序。我想使用乐观并发,所以需要创建一个表结构,让EF检测并发问题。我的目标与此类似:http://blogs.msdn.com/b/alexj/archive/2009/05/20/tip-19-how-to-use-optimistic-concurrency-in-the-entity-framework.aspx。我的问题是MySQL中的时间戳类型与MSSQLServer不同。除此之外,timestamp和datetime都不能提供MySQL的亚秒精度(http://feedblog.org/2007/05/26/why-doesnt-mysql-support-millisecond-datetime-resolution/)。因此,这些类型在检测并发问题方面可能非常糟糕。我可以使用哪些其他数据类型来解决这个问题?我正在考虑使用Guid。但是这种方法有两个潜在的问题:1.MySQL将Guids存储为char(36),效率非常低。2.我不确定EF是否要求行版本严格递增,或者是否足以使其唯一。大警告:没有测试-只是大声思考。EF支持重写SaveChanges,因此一种选择可能是定义如下接口:interfaceIVersionedRow{intRowVersion{get;set;}}并将intRowVersion属性/字段添加到模型类和数据库表中,并使用分部类来实现这个接口(使用隐式接口实现):partialclassCustomer:IVersionedRow{}partialclassOrder:IVersionedRow{}...然后覆盖SaveChanges,类似于:publicoverrideintSaveChanges(SaveOptionsoptions){foreach(ObjectStateManager中的ObjectStateEntry条目。GetObjectStateEntries(EntityState.Modified)){varv=entry.EntityasIVersionedRow;if(v!=null)v.RowVersion++;}返回base.SaveChanges(选项);然后应该作为手动实现的行版本计数器运行(理论上-未测试)。为RowVersion启用更改验证,它应该被提供。我刚刚向MySQL.NETConnectorv6.9.10提交了一个PR,它提供了这个问题的解决方案,在EF和非EF应用程序之间提供乐观锁定。有关详细信息,请参阅https://stackoverflow.com/a/50147396/365261。这是经过测试的解决方案(适用于EF6及更高版本)。下面是你在模型中要做的事情:行版本{得到;放;然后在你的上下文中:base.OnModelCreating(模型构建器);}publicoverrideintSaveChanges(){varobjectContextAdapter=thisasIObjectContextAdapter;if(objectContextAdapter!=null){objectContextAdapter.ObjectContext.DetectChanges();foreach(objectContextAdapter中的ObjectStateEntry条目。)){varv=entry.EntityasIVersionedRow;if(v!=null)v.RowVersion++;}}返回base.SaveChanges();现在不要忘记在执行更新或删除操作时包含DbUpdateConcurrencyException。它非常适合我。以上就是C#学习教程的全部内容:使用EntityFramework和MySQL实现乐观并发共享。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。涉及侵权,请点击维权联系管理员删除。如需转载请注明出处:
