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-mvc – 不需要必需属性的bool属性
- asp.net – ADFS 2.0超时以及Freshness Value,TokenLifetim
- asp.net-mvc – 为什么UserManager.CreateIdentityAsync()正
- asp.net – 无法为自定义MembershipProvider创建Membership
- 获取当前的ASP.NET机器密钥
- asp.net-mvc – ASP.NET MVC用户友好401错误
- 深入理解Asp.Net中WebForm的生命周期
- 如何向ASP.NET Core 1.0 MVC项目添加项目引用
- asp.net-mvc – 使用TFS 2015 Build构建和部署Web应用程序
- .net – ActionFilterAttribute不重定向
- asp.net – 确定哪个UpdatePanel导致部分(异步)P
- 为什么asp.net OnTextChanged不工作
- asp.net – 使用GhostScript将PDF转换为服务器上
- asp.net-mvc – ASP.NET MVC领域:它们对大型应用
- asp.net – 如何将下拉列表添加为gridview项
- asp.net – 如何知道为什么IIS应用程序池被回收
- 如何在ASP.NET MVC中使用flot和jQuery?
- asp.net-core – ASP.NET核心查找所有程序集中的
- asp.net-mvc – 在ASP.NET MVC Preview 4中使用路
- asp.net-mvc-3 – ASP.NET MVC 3.0 Razor,从任何
