diff --git a/src/AbpDesk/AbpDesk.EntityFrameworkCore/AbpDesk/EntityFrameworkCore/AbpDeskDbContext.cs b/src/AbpDesk/AbpDesk.EntityFrameworkCore/AbpDesk/EntityFrameworkCore/AbpDeskDbContext.cs index 20057b2e75..da9b462e92 100644 --- a/src/AbpDesk/AbpDesk.EntityFrameworkCore/AbpDesk/EntityFrameworkCore/AbpDeskDbContext.cs +++ b/src/AbpDesk/AbpDesk.EntityFrameworkCore/AbpDesk/EntityFrameworkCore/AbpDeskDbContext.cs @@ -18,12 +18,12 @@ namespace AbpDesk.EntityFrameworkCore protected override void OnModelCreating(ModelBuilder modelBuilder) { - //TODO: Use different classes to map each entity type? + base.OnModelCreating(modelBuilder); + //Use different classes to map each entity type? modelBuilder.Entity(builder => { builder.ToTable("DskTickets"); - builder.Property(t => t.ConcurrencyStamp).IsConcurrencyToken(); }); } } diff --git a/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs b/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs index 387670ba78..f7947068da 100644 --- a/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs +++ b/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs @@ -1,6 +1,10 @@ -using System.Threading; +using System.Linq; +using System.Reflection; +using System.Threading; using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata; +using Volo.Abp.Domain.Entities; using Volo.Abp.Uow; namespace Volo.Abp.EntityFrameworkCore @@ -18,7 +22,10 @@ namespace Volo.Abp.EntityFrameworkCore { base.OnModelCreating(modelBuilder); - //TODO: Automatically configure ConcurrencyStamp + foreach (var entityType in modelBuilder.Model.GetEntityTypes()) + { + ConfigureConcurrencyStamp(entityType); + } } public override int SaveChanges(bool acceptAllChangesOnSuccess) @@ -44,5 +51,18 @@ namespace Volo.Abp.EntityFrameworkCore throw new AbpDbConcurrencyException(ex.Message, ex); } } + + protected virtual void ConfigureConcurrencyStamp(IMutableEntityType entityType) + { + if (!typeof(IHasConcurrencyStamp).GetTypeInfo().IsAssignableFrom(entityType.ClrType)) + { + return; + } + + entityType + .GetProperties() + .First(p => p.Name == nameof(IHasConcurrencyStamp.ConcurrencyStamp)) + .IsConcurrencyToken = true; + } } } \ No newline at end of file diff --git a/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IdentityDbContext.cs b/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IdentityDbContext.cs index c7342ca412..9b87563bd4 100644 --- a/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IdentityDbContext.cs +++ b/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IdentityDbContext.cs @@ -64,14 +64,11 @@ namespace Volo.Abp.Identity.EntityFrameworkCore base.OnModelCreating(builder); //TODO: Set Default Values for properties - //TODO: Split configuration to dedicated classes. - builder.Entity(b => { b.ToTable("IdentityUsers"); - b.Property(u => u.ConcurrencyStamp).IsConcurrencyToken(); b.Property(u => u.UserName).HasMaxLength(256); b.Property(u => u.NormalizedUserName).HasMaxLength(256); b.Property(u => u.Email).HasMaxLength(256);