diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/Modeling/AbpEntityTypeBuilderExtensions.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/Modeling/AbpEntityTypeBuilderExtensions.cs index 9bb2f9018d..093d229848 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/Modeling/AbpEntityTypeBuilderExtensions.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/Modeling/AbpEntityTypeBuilderExtensions.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; using Newtonsoft.Json; @@ -11,25 +12,52 @@ namespace Volo.Abp.EntityFrameworkCore.Modeling { public static class AbpEntityTypeBuilderExtensions { + public static void ConfigureByConvention(this EntityTypeBuilder b) + { + b.TryConfigureConcurrencyStamp(); + b.TryConfigureExtraProperties(); + //TODO: Others + } + public static void ConfigureConcurrencyStamp(this EntityTypeBuilder b) where T : class, IHasConcurrencyStamp { - b.Property(x => x.ConcurrencyStamp) - .IsConcurrencyToken() - .HasColumnName(nameof(IHasConcurrencyStamp.ConcurrencyStamp)); + b.As().TryConfigureConcurrencyStamp(); + } + + public static void TryConfigureConcurrencyStamp(this EntityTypeBuilder b) + { + if (b.Metadata.ClrType.IsAssignableTo()) + { + //TODO: Max length? + b.Property(nameof(IHasConcurrencyStamp.ConcurrencyStamp)) + .IsConcurrencyToken() + .HasColumnName(nameof(IHasConcurrencyStamp.ConcurrencyStamp)); + } } public static void ConfigureExtraProperties(this EntityTypeBuilder b) where T : class, IHasExtraProperties { - b.Property(x => x.ExtraProperties) - .HasConversion( - d => JsonConvert.SerializeObject(d, Formatting.None), - s => JsonConvert.DeserializeObject>(s) - ) - .HasColumnName(nameof(IHasExtraProperties.ExtraProperties)); + b.As().TryConfigureExtraProperties(); } + public static void TryConfigureExtraProperties(this EntityTypeBuilder b) + { + //TODO: Max length? + if (b.Metadata.ClrType.IsAssignableTo()) + { + b.Property>(nameof(IHasExtraProperties.ExtraProperties)) + .HasConversion( + d => JsonConvert.SerializeObject(d, Formatting.None), + s => JsonConvert.DeserializeObject>(s) + ) + .HasColumnName(nameof(IHasExtraProperties.ExtraProperties)); + } + } + + //TODO: Others like ConfigureConcurrencyStamp/TryConfigureConcurrencyStamp and ConfigureExtraProperties/TryConfigureExtraProperties + public static void ConfigureSoftDelete(this EntityTypeBuilder b) where T : class, ISoftDelete {