C# 无时间戳的EF核心乐观并发

C# 无时间戳的EF核心乐观并发,c#,.net,entity-framework,ef-core-2.1,C#,.net,Entity Framework,Ef Core 2.1,我正在处理一组实体,每个实体都有几个属性。 保存时,每个属性都参与乐观并发检查。 我宁愿避免使用时间戳,因为我应该在每个表上添加字段,我使用的是遗留数据库,我不想对其进行任何更改。 采用的解决方案依赖于在modelBuilder中调用IsConcurrencyToken protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Ent

我正在处理一组实体,每个实体都有几个属性。 保存时,每个属性都参与乐观并发检查。 我宁愿避免使用时间戳,因为我应该在每个表上添加字段,我使用的是遗留数据库,我不想对其进行任何更改。 采用的解决方案依赖于在modelBuilder中调用IsConcurrencyToken

 protected override void OnModelCreating(ModelBuilder modelBuilder)
            {
                modelBuilder.Entity<MyEntity1>(entity =>
                {
                    entity.Property(e => e.Property1).IsConcurrencyToken;
                    entity.Property(e => e.Property2).IsConcurrencyToken;
                    entity.Property(e => e.Property3).IsConcurrencyToken;


                    entity.Property(e => e.PropertyN).IsConcurrencyToken;
                });         
             }
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
modelBuilder.Entity(Entity=>
{
entity.Property(e=>e.Property1).IsConcurrencyToken;
entity.Property(e=>e.Property2).IsConcurrencyToken;
entity.Property(e=>e.Property3).IsConcurrencyToken;
entity.Property(e=>e.PropertyN).IsConcurrencyToken;
});         
}
但我真的需要为每个属性显式调用
IsConcurrencyToken
?是否有机会将我的实体配置为自动在并发检查中包含每个属性

是否有机会将我的实体配置为自动在并发检查中包含每个属性

对。您可以在OnModelCreating中迭代所有实体和属性:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    foreach (var entity in modelBuilder.Model.GetEntityTypes())
    {
        foreach (var prop in entity.GetProperties())
        {
            prop.IsConcurrencyToken = true;
        }
    }

    base.OnModelCreating(modelBuilder);
}

感谢大卫·布朗的建议

由于我希望能够逐个实体启用并发性,所以我将代码包装在扩展方法中

  public static EntityTypeBuilder<TEntity> EnableConcurrency<TEntity>(this EntityTypeBuilder<TEntity> entityTypeBuilder) where TEntity : class
        {
            var entity = entityTypeBuilder.Metadata.Model.FindEntityType(typeof(TEntity));
            foreach (var prop in entity.GetProperties())
            {
                prop.IsConcurrencyToken = true;
            }
            return entityTypeBuilder;
        }
公共静态EntityTypeBuilder EnableConcurrency(此EntityTypeBuilder EntityTypeBuilder),其中tenty:class
{
var entity=entityTypeBuilder.Metadata.Model.FindEntityType(typeof(tenty));
foreach(entity.GetProperties()中的var prop)
{
prop.IsConcurrencyToken=true;
}
返回entityTypeBuilder;
}
我会像那样使用它

modelBuilder.Entity<MyEntity>(entity =>
            {
                entity.EnableConcurrency();
            });
modelBuilder.Entity(Entity=>
{
entity.EnableConcurrency();
});

但我真的需要为每个属性设置call IsConcurrencyToken吗?这主要是基于观点的。@GertArnold-不,不是。。。这是一个基于足够精确的要求的技术问题。我不是在询问关于在并发检查中包含所有属性的选择的意见,而是是否有比逐个属性显式设置更快的方法来执行此操作。只要我们没有更多细节,这就是意见。更新时当前db值无关紧要的字段,或创建后永远不会更新的字段(根据业务逻辑),如何处理?编辑时值发生更改的计算字段如何?无需将它们标记为并发令牌。然后可能有一些领域应该有“最后一个赢”的策略(f.e.“LastSeenBy”)。IMO将所有属性标记为并发令牌太简单了。它可能必须是每个实体的操作。