From 7529f9e388b69fa8992031b4b28687145471d4fe Mon Sep 17 00:00:00 2001 From: maliming <6908465+maliming@users.noreply.github.com> Date: Mon, 27 Jul 2020 17:36:35 +0800 Subject: [PATCH 1/3] Use EntityTypeBuilder & PropertyBuilder in the MapEfCoreProperty method. Resolve #4891 --- .../EfCoreObjectExtensionInfoExtensions.cs | 6 +++--- .../EfCoreObjectExtensionManagerExtensions.cs | 8 +++---- ...reObjectExtensionPropertyInfoExtensions.cs | 2 +- ...tensionPropertyInfoEfCoreMappingOptions.cs | 8 +++---- .../Domain/ExtraProperties_Tests.cs | 21 ++++++++++++++++++- .../Domain/TestEntityExtensionConfigurator.cs | 7 +++++-- ...rojectNameEfCoreEntityExtensionMappings.cs | 2 +- 7 files changed, 38 insertions(+), 16 deletions(-) diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/ObjectExtending/EfCoreObjectExtensionInfoExtensions.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/ObjectExtending/EfCoreObjectExtensionInfoExtensions.cs index ef3d87119a..628a8745d1 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/ObjectExtending/EfCoreObjectExtensionInfoExtensions.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/ObjectExtending/EfCoreObjectExtensionInfoExtensions.cs @@ -9,7 +9,7 @@ namespace Volo.Abp.ObjectExtending public static ObjectExtensionInfo MapEfCoreProperty( [NotNull] this ObjectExtensionInfo objectExtensionInfo, [NotNull] string propertyName, - [CanBeNull] Action propertyBuildAction) + [CanBeNull] Action propertyBuildAction) { return objectExtensionInfo.MapEfCoreProperty( typeof(TProperty), @@ -22,7 +22,7 @@ namespace Volo.Abp.ObjectExtending [NotNull] this ObjectExtensionInfo objectExtensionInfo, [NotNull] Type propertyType, [NotNull] string propertyName, - [CanBeNull] Action propertyBuildAction) + [CanBeNull] Action propertyBuildAction) { Check.NotNull(objectExtensionInfo, nameof(objectExtensionInfo)); @@ -38,4 +38,4 @@ namespace Volo.Abp.ObjectExtending ); } } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/ObjectExtending/EfCoreObjectExtensionManagerExtensions.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/ObjectExtending/EfCoreObjectExtensionManagerExtensions.cs index 52dca0c105..7476c2c928 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/ObjectExtending/EfCoreObjectExtensionManagerExtensions.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/ObjectExtending/EfCoreObjectExtensionManagerExtensions.cs @@ -1,4 +1,4 @@ -using System; +using System; using JetBrains.Annotations; using Microsoft.EntityFrameworkCore.Metadata.Builders; using Volo.Abp.Data; @@ -11,7 +11,7 @@ namespace Volo.Abp.ObjectExtending public static ObjectExtensionManager MapEfCoreProperty( [NotNull] this ObjectExtensionManager objectExtensionManager, [NotNull] string propertyName, - [CanBeNull] Action propertyBuildAction = null) + [CanBeNull] Action propertyBuildAction = null) where TEntity : IHasExtraProperties, IEntity { return objectExtensionManager.MapEfCoreProperty( @@ -27,7 +27,7 @@ namespace Volo.Abp.ObjectExtending [NotNull] Type entityType, [NotNull] Type propertyType, [NotNull] string propertyName, - [CanBeNull] Action propertyBuildAction = null) + [CanBeNull] Action propertyBuildAction = null) { Check.NotNull(objectExtensionManager, nameof(objectExtensionManager)); @@ -73,7 +73,7 @@ namespace Volo.Abp.ObjectExtending var propertyBuilder = typeBuilder.Property(property.Type, property.Name); - efCoreMapping.PropertyBuildAction?.Invoke(propertyBuilder); + efCoreMapping.PropertyBuildAction?.Invoke(typeBuilder, propertyBuilder); } } } diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/ObjectExtending/EfCoreObjectExtensionPropertyInfoExtensions.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/ObjectExtending/EfCoreObjectExtensionPropertyInfoExtensions.cs index fda5d88ceb..9195a1311c 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/ObjectExtending/EfCoreObjectExtensionPropertyInfoExtensions.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/ObjectExtending/EfCoreObjectExtensionPropertyInfoExtensions.cs @@ -12,7 +12,7 @@ namespace Volo.Abp.ObjectExtending [NotNull] public static ObjectExtensionPropertyInfo MapEfCore( [NotNull] this ObjectExtensionPropertyInfo propertyExtension, - [CanBeNull] Action propertyBuildAction = null) + [CanBeNull] Action propertyBuildAction = null) { Check.NotNull(propertyExtension, nameof(propertyExtension)); diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/ObjectExtending/ObjectExtensionPropertyInfoEfCoreMappingOptions.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/ObjectExtending/ObjectExtensionPropertyInfoEfCoreMappingOptions.cs index 4189c87962..ea07ccd5b2 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/ObjectExtending/ObjectExtensionPropertyInfoEfCoreMappingOptions.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/ObjectExtending/ObjectExtensionPropertyInfoEfCoreMappingOptions.cs @@ -13,15 +13,15 @@ namespace Volo.Abp.ObjectExtending public ObjectExtensionInfo ObjectExtension => ExtensionProperty.ObjectExtension; [CanBeNull] - public Action PropertyBuildAction { get; set; } + public Action PropertyBuildAction { get; set; } public ObjectExtensionPropertyInfoEfCoreMappingOptions( [NotNull] ObjectExtensionPropertyInfo extensionProperty, - [CanBeNull] Action propertyBuildAction = null) + [CanBeNull] Action propertyBuildAction = null) { ExtensionProperty = Check.NotNull(extensionProperty, nameof(extensionProperty)); - + PropertyBuildAction = propertyBuildAction; } } -} \ No newline at end of file +} diff --git a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/Domain/ExtraProperties_Tests.cs b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/Domain/ExtraProperties_Tests.cs index 557116d158..338342f0cf 100644 --- a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/Domain/ExtraProperties_Tests.cs +++ b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/Domain/ExtraProperties_Tests.cs @@ -1,6 +1,10 @@ -using System.Threading.Tasks; +using System; +using System.Linq; +using System.Threading.Tasks; using Shouldly; using Volo.Abp.Data; +using Volo.Abp.Domain.Repositories; +using Volo.Abp.TestApp.Domain; using Volo.Abp.TestApp.Testing; using Xunit; @@ -28,5 +32,20 @@ namespace Volo.Abp.EntityFrameworkCore.Domain var london2 = await CityRepository.FindByNameAsync("London"); london2.GetProperty("PhoneCode").ShouldBe("53"); } + + + [Fact] + public async Task An_Extra_Property_Configured_As_Extension2() + { + await WithUnitOfWorkAsync(() => + { + var entityEntry = CityRepository.GetDbContext().Attach(new City(Guid.NewGuid(), "NewYork")); + var indexes = entityEntry.Metadata.GetIndexes().ToList(); + indexes.ShouldNotBeEmpty(); + indexes.ShouldContain(x => x.IsUnique); + return Task.CompletedTask; + }); + + } } } diff --git a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/Domain/TestEntityExtensionConfigurator.cs b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/Domain/TestEntityExtensionConfigurator.cs index 3d415d79e6..fe81ee325b 100644 --- a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/Domain/TestEntityExtensionConfigurator.cs +++ b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/Domain/TestEntityExtensionConfigurator.cs @@ -15,8 +15,11 @@ namespace Volo.Abp.EntityFrameworkCore.Domain ObjectExtensionManager.Instance .MapEfCoreProperty( "PhoneCode", - p => p.HasMaxLength(8) - ); + (e, p) => + { + e.HasIndex(p.Metadata.Name).IsUnique(); + p.HasMaxLength(8); + }); }); } } diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/EntityFrameworkCore/MyProjectNameEfCoreEntityExtensionMappings.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/EntityFrameworkCore/MyProjectNameEfCoreEntityExtensionMappings.cs index 0b19050cb0..86d8baf710 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/EntityFrameworkCore/MyProjectNameEfCoreEntityExtensionMappings.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/EntityFrameworkCore/MyProjectNameEfCoreEntityExtensionMappings.cs @@ -27,7 +27,7 @@ namespace MyCompanyName.MyProjectName.EntityFrameworkCore * ObjectExtensionManager.Instance * .MapEfCoreProperty( * "MyProperty", - * b => b.HasMaxLength(128) + * (e, b) => b.HasMaxLength(128) * ); * * See the documentation for more: From 9b9c66034a78b8296b47ac027ce4e1ec35e826ee Mon Sep 17 00:00:00 2001 From: maliming <6908465+maliming@users.noreply.github.com> Date: Mon, 10 Aug 2020 14:20:24 +0800 Subject: [PATCH 2/3] Add EntityTypeAndPropertyBuildAction to the ObjectExtensionPropertyInfoEfCoreMappingOptions. --- .../EfCoreObjectExtensionInfoExtensions.cs | 36 ++++++++++++++- .../EfCoreObjectExtensionManagerExtensions.cs | 45 +++++++++++++++++-- ...reObjectExtensionPropertyInfoExtensions.cs | 18 +++++++- ...tensionPropertyInfoEfCoreMappingOptions.cs | 9 +++- 4 files changed, 99 insertions(+), 9 deletions(-) diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/ObjectExtending/EfCoreObjectExtensionInfoExtensions.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/ObjectExtending/EfCoreObjectExtensionInfoExtensions.cs index 628a8745d1..91184ecdeb 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/ObjectExtending/EfCoreObjectExtensionInfoExtensions.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/ObjectExtending/EfCoreObjectExtensionInfoExtensions.cs @@ -9,7 +9,7 @@ namespace Volo.Abp.ObjectExtending public static ObjectExtensionInfo MapEfCoreProperty( [NotNull] this ObjectExtensionInfo objectExtensionInfo, [NotNull] string propertyName, - [CanBeNull] Action propertyBuildAction) + [CanBeNull] Action propertyBuildAction) { return objectExtensionInfo.MapEfCoreProperty( typeof(TProperty), @@ -22,7 +22,7 @@ namespace Volo.Abp.ObjectExtending [NotNull] this ObjectExtensionInfo objectExtensionInfo, [NotNull] Type propertyType, [NotNull] string propertyName, - [CanBeNull] Action propertyBuildAction) + [CanBeNull] Action propertyBuildAction) { Check.NotNull(objectExtensionInfo, nameof(objectExtensionInfo)); @@ -37,5 +37,37 @@ namespace Volo.Abp.ObjectExtending } ); } + + public static ObjectExtensionInfo MapEfCoreProperty( + [NotNull] this ObjectExtensionInfo objectExtensionInfo, + [NotNull] string propertyName, + [CanBeNull] Action entityTypeAndPropertyBuildAction) + { + return objectExtensionInfo.MapEfCoreProperty( + typeof(TProperty), + propertyName, + entityTypeAndPropertyBuildAction + ); + } + + public static ObjectExtensionInfo MapEfCoreProperty( + [NotNull] this ObjectExtensionInfo objectExtensionInfo, + [NotNull] Type propertyType, + [NotNull] string propertyName, + [CanBeNull] Action entityTypeAndPropertyBuildAction) + { + Check.NotNull(objectExtensionInfo, nameof(objectExtensionInfo)); + + return objectExtensionInfo.AddOrUpdateProperty( + propertyType, + propertyName, + options => + { + options.MapEfCore( + entityTypeAndPropertyBuildAction + ); + } + ); + } } } diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/ObjectExtending/EfCoreObjectExtensionManagerExtensions.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/ObjectExtending/EfCoreObjectExtensionManagerExtensions.cs index 7476c2c928..06f360be6c 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/ObjectExtending/EfCoreObjectExtensionManagerExtensions.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/ObjectExtending/EfCoreObjectExtensionManagerExtensions.cs @@ -1,4 +1,4 @@ -using System; +using System; using JetBrains.Annotations; using Microsoft.EntityFrameworkCore.Metadata.Builders; using Volo.Abp.Data; @@ -11,7 +11,7 @@ namespace Volo.Abp.ObjectExtending public static ObjectExtensionManager MapEfCoreProperty( [NotNull] this ObjectExtensionManager objectExtensionManager, [NotNull] string propertyName, - [CanBeNull] Action propertyBuildAction = null) + [CanBeNull] Action propertyBuildAction = null) where TEntity : IHasExtraProperties, IEntity { return objectExtensionManager.MapEfCoreProperty( @@ -27,7 +27,7 @@ namespace Volo.Abp.ObjectExtending [NotNull] Type entityType, [NotNull] Type propertyType, [NotNull] string propertyName, - [CanBeNull] Action propertyBuildAction = null) + [CanBeNull] Action propertyBuildAction = null) { Check.NotNull(objectExtensionManager, nameof(objectExtensionManager)); @@ -44,6 +44,42 @@ namespace Volo.Abp.ObjectExtending ); } + public static ObjectExtensionManager MapEfCoreProperty( + [NotNull] this ObjectExtensionManager objectExtensionManager, + [NotNull] string propertyName, + [CanBeNull] Action entityTypeAndPropertyBuildAction = null) + where TEntity : IHasExtraProperties, IEntity + { + return objectExtensionManager.MapEfCoreProperty( + typeof(TEntity), + typeof(TProperty), + propertyName, + entityTypeAndPropertyBuildAction + ); + } + + public static ObjectExtensionManager MapEfCoreProperty( + [NotNull] this ObjectExtensionManager objectExtensionManager, + [NotNull] Type entityType, + [NotNull] Type propertyType, + [NotNull] string propertyName, + [CanBeNull] Action entityTypeAndPropertyBuildAction = null) + { + Check.NotNull(objectExtensionManager, nameof(objectExtensionManager)); + + return objectExtensionManager.AddOrUpdateProperty( + entityType, + propertyType, + propertyName, + options => + { + options.MapEfCore( + entityTypeAndPropertyBuildAction + ); + } + ); + } + public static void ConfigureEfCoreEntity( [NotNull] this ObjectExtensionManager objectExtensionManager, [NotNull] EntityTypeBuilder typeBuilder) @@ -73,7 +109,8 @@ namespace Volo.Abp.ObjectExtending var propertyBuilder = typeBuilder.Property(property.Type, property.Name); - efCoreMapping.PropertyBuildAction?.Invoke(typeBuilder, propertyBuilder); + efCoreMapping.EntityTypeAndPropertyBuildAction?.Invoke(typeBuilder, propertyBuilder); + efCoreMapping.PropertyBuildAction?.Invoke(propertyBuilder); } } } diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/ObjectExtending/EfCoreObjectExtensionPropertyInfoExtensions.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/ObjectExtending/EfCoreObjectExtensionPropertyInfoExtensions.cs index 9195a1311c..6e0c1ccc22 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/ObjectExtending/EfCoreObjectExtensionPropertyInfoExtensions.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/ObjectExtending/EfCoreObjectExtensionPropertyInfoExtensions.cs @@ -12,7 +12,7 @@ namespace Volo.Abp.ObjectExtending [NotNull] public static ObjectExtensionPropertyInfo MapEfCore( [NotNull] this ObjectExtensionPropertyInfo propertyExtension, - [CanBeNull] Action propertyBuildAction = null) + [CanBeNull] Action propertyBuildAction = null) { Check.NotNull(propertyExtension, nameof(propertyExtension)); @@ -25,6 +25,22 @@ namespace Volo.Abp.ObjectExtending return propertyExtension; } + [NotNull] + public static ObjectExtensionPropertyInfo MapEfCore( + [NotNull] this ObjectExtensionPropertyInfo propertyExtension, + [CanBeNull] Action entityTypeAndPropertyBuildAction = null) + { + Check.NotNull(propertyExtension, nameof(propertyExtension)); + + propertyExtension.Configuration[EfCorePropertyConfigurationName] = + new ObjectExtensionPropertyInfoEfCoreMappingOptions( + propertyExtension, + entityTypeAndPropertyBuildAction: entityTypeAndPropertyBuildAction + ); + + return propertyExtension; + } + [CanBeNull] public static ObjectExtensionPropertyInfoEfCoreMappingOptions GetEfCoreMappingOrNull( [NotNull] this ObjectExtensionPropertyInfo propertyExtension) diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/ObjectExtending/ObjectExtensionPropertyInfoEfCoreMappingOptions.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/ObjectExtending/ObjectExtensionPropertyInfoEfCoreMappingOptions.cs index ea07ccd5b2..fd5d84f74b 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/ObjectExtending/ObjectExtensionPropertyInfoEfCoreMappingOptions.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/ObjectExtending/ObjectExtensionPropertyInfoEfCoreMappingOptions.cs @@ -13,15 +13,20 @@ namespace Volo.Abp.ObjectExtending public ObjectExtensionInfo ObjectExtension => ExtensionProperty.ObjectExtension; [CanBeNull] - public Action PropertyBuildAction { get; set; } + public Action EntityTypeAndPropertyBuildAction { get; set; } + + [CanBeNull] + public Action PropertyBuildAction { get; set; } public ObjectExtensionPropertyInfoEfCoreMappingOptions( [NotNull] ObjectExtensionPropertyInfo extensionProperty, - [CanBeNull] Action propertyBuildAction = null) + [CanBeNull] Action propertyBuildAction = null, + [CanBeNull] Action entityTypeAndPropertyBuildAction = null) { ExtensionProperty = Check.NotNull(extensionProperty, nameof(extensionProperty)); PropertyBuildAction = propertyBuildAction; + EntityTypeAndPropertyBuildAction = entityTypeAndPropertyBuildAction; } } } From 9abd58dae1895226c15ea8048369ab9649499399 Mon Sep 17 00:00:00 2001 From: maliming <6908465+maliming@users.noreply.github.com> Date: Mon, 10 Aug 2020 14:25:33 +0800 Subject: [PATCH 3/3] Revert sample code of template project. --- .../ObjectExtensionPropertyInfoEfCoreMappingOptions.cs | 4 ++-- .../MyProjectNameEfCoreEntityExtensionMappings.cs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/ObjectExtending/ObjectExtensionPropertyInfoEfCoreMappingOptions.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/ObjectExtending/ObjectExtensionPropertyInfoEfCoreMappingOptions.cs index fd5d84f74b..15a818478b 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/ObjectExtending/ObjectExtensionPropertyInfoEfCoreMappingOptions.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/ObjectExtending/ObjectExtensionPropertyInfoEfCoreMappingOptions.cs @@ -13,10 +13,10 @@ namespace Volo.Abp.ObjectExtending public ObjectExtensionInfo ObjectExtension => ExtensionProperty.ObjectExtension; [CanBeNull] - public Action EntityTypeAndPropertyBuildAction { get; set; } + public Action PropertyBuildAction { get; set; } [CanBeNull] - public Action PropertyBuildAction { get; set; } + public Action EntityTypeAndPropertyBuildAction { get; set; } public ObjectExtensionPropertyInfoEfCoreMappingOptions( [NotNull] ObjectExtensionPropertyInfo extensionProperty, diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/EntityFrameworkCore/MyProjectNameEfCoreEntityExtensionMappings.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/EntityFrameworkCore/MyProjectNameEfCoreEntityExtensionMappings.cs index 86d8baf710..0b19050cb0 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/EntityFrameworkCore/MyProjectNameEfCoreEntityExtensionMappings.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/EntityFrameworkCore/MyProjectNameEfCoreEntityExtensionMappings.cs @@ -27,7 +27,7 @@ namespace MyCompanyName.MyProjectName.EntityFrameworkCore * ObjectExtensionManager.Instance * .MapEfCoreProperty( * "MyProperty", - * (e, b) => b.HasMaxLength(128) + * b => b.HasMaxLength(128) * ); * * See the documentation for more: