asp.net-core – 使用Entity Framework 7处理乐观并发的最佳方法
我正在使用ASP.NET 5 rc1和Entity 7 rc1 over coreclr以及示例代码第一次迁移项目.
我正在研究如何管理实体中的并发性,但我找不到有关实体7的推荐并发处理实践的任何好的更新信息. 我有几个实体,他们都实现了接口: public interface IVersionedModel { byte [] RowVersion { get; set; } } 例如: public class User : IVersionedModel { public Guid UserId { get; set; } public string Name { get; set; } public byte[] RowVersion { get; set; } } 而是将属性[Timestamp]添加到每个RowVersion列,我更喜欢使用fluent配置,因此在我的DbContext中,我为每个实体指定了我希望该列作为行版本处理. 然而,实体7似乎不再支持该选项.IsRowVersion() 我想知道最好的办法是在更新或在数据库中插入实体时通过增加版本来显式管理每行的版本. public class AppDbContext : DbContext { public AppDbContext() : base() { } public DbSet<User> Users { get; set; } public DbSet<Organization> Organizations { get; set; } public DbSet<Membership> Memberships { get; set; } public override int SaveChanges() { //increase entity version for concurrency purposes foreach(var dbEntityEntry in ChangeTracker.Entries() .Where(x => x.State == EntityState.Added || x.State == EntityState.Modified)) { IVersionedModel entity = dbEntityEntry.Entity as IVersionedModel; if(entity != null) { //Increase byte[] RowVersion? } } return base.SaveChanges(); } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<User>().Property(u => u.RowVersion).IsConcurrencyToken(); modelBuilder.Entity<Organization>().Property(o => o.RowVersion).IsConcurrencyToken(); modelBuilder.Entity<Membership>().Property(m => m.RowVersion).IsConcurrencyToken(); } } 基本上我的问题是,如何使用ASP.NET 5和Entity 7处理并发? 更新:感谢https://stackoverflow.com/users/1922568/joe-audette提供的链接我发现了一些答案,不幸的是并非全部 按照http://docs.efproject.net/en/latest/modeling/concurrency.html#how-concurrency-tokens-work-in-ef 流畅的API仅允许使用.IsConcurrencyToken()配置并发令牌 我还没有找到一种方法通过流畅的API来使用专用列对整行进行版本化(如果流畅的API允许使用.IsRowVersion(),它会很好,但它不会) 解决方法
我已经创建了一个静态类来处理EF7 ModelBuilder的这个和其他缺失的功能(谨慎使用,未在生产环境中测试)
public static class SqlServerModelBuilderExtensions { public static PropertyBuilder<decimal?> HasPrecision(this PropertyBuilder<decimal?> builder,int precision,int scale) { return builder.HasColumnType($"decimal({precision},{scale})"); } public static PropertyBuilder<decimal> HasPrecision(this PropertyBuilder<decimal> builder,{scale})"); } public static PropertyBuilder<byte[]> IsRowVersion(this PropertyBuilder<byte[]> builder) { return builder.HasColumnType("rowversion").IsConcurrencyToken().ValueGeneratedOnAdd(); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- ASP.NET调试与IIS超时
- 我如何让Fiddler捕获我的MVC应用程序向我的ASP.NET Web API
- asp.net-mvc – ViewModel中的MVC3 RouteUrl
- asp.net-mvc – 检查DateTime类型的值在视图中是否为null,如
- ASP.NET身份
- 经典的asp字符编码
- asp.net-mvc – .NET MVC:计算Web应用程序中的Action方法
- asp.net-core – 在asp.net vnext中使用Startup.cs中的Conf
- asp.net-mvc-3 – 在MVC3中设置所选选项
- asp.net-mvc – MVC – 它只是一个三层模型吗?
- asp.net-mvc – MVC DropDownListFor在视图中基本
- asp.net – 我应该花费我的努力实现knockoutjs或
- 你如何获得asp.net控件的自动生成的name属性?
- ASP.NET ::在page_load期间,如何获取提交回发的控
- asp.net – HTTP文件如何在IIS内部上传?
- ASP.NET模拟问题(第2部分)
- asp.net-mvc – 保持viewdata在RedirectToAction
- asp.net – 第一次访问网站需要非常长的时间(总共
- ASP.NET AJAX AsyncFileUpload UploadedComplete
- jQuery validate 根据 asp.net MVC的验证提取简单