From 01d2ea0b00b7fc58d165e7d0ee70133b2c758e1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sun, 29 Mar 2020 12:49:16 +0300 Subject: [PATCH] Refactor EF Core entity extensions. --- framework/src/Volo.Abp.Core/Volo/Abp/Check.cs | 2 +- .../EfCoreObjectExtensionManagerExtensions.cs | 71 ++++++++++--------- ...reObjectExtensionPropertyInfoExtensions.cs | 18 +++-- ...tensionPropertyInfoEfCoreMappingOptions.cs | 1 + 4 files changed, 55 insertions(+), 37 deletions(-) diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Check.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Check.cs index d1ce8b6e76..7001925745 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Check.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Check.cs @@ -130,7 +130,7 @@ namespace Volo.Abp if (!type.IsAssignableTo()) { - throw new ArgumentException($"{parameterName} should be assignable to the {typeof(TBaseType).GetFullNameWithAssemblyName()}!"); + throw new ArgumentException($"{parameterName} (type of {type.AssemblyQualifiedName}) should be assignable to the {typeof(TBaseType).GetFullNameWithAssemblyName()}!"); } return type; 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 a7c392f7c4..52dca0c105 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/ObjectExtending/EfCoreObjectExtensionManagerExtensions.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/ObjectExtending/EfCoreObjectExtensionManagerExtensions.cs @@ -1,19 +1,21 @@ using System; +using JetBrains.Annotations; using Microsoft.EntityFrameworkCore.Metadata.Builders; using Volo.Abp.Data; +using Volo.Abp.Domain.Entities; namespace Volo.Abp.ObjectExtending { public static class EfCoreObjectExtensionManagerExtensions { - public static ObjectExtensionManager MapEfCoreProperty( - this ObjectExtensionManager objectExtensionManager, - string propertyName, - Action propertyBuildAction) - where TObject : IHasExtraProperties + public static ObjectExtensionManager MapEfCoreProperty( + [NotNull] this ObjectExtensionManager objectExtensionManager, + [NotNull] string propertyName, + [CanBeNull] Action propertyBuildAction = null) + where TEntity : IHasExtraProperties, IEntity { return objectExtensionManager.MapEfCoreProperty( - typeof(TObject), + typeof(TEntity), typeof(TProperty), propertyName, propertyBuildAction @@ -21,14 +23,16 @@ namespace Volo.Abp.ObjectExtending } public static ObjectExtensionManager MapEfCoreProperty( - this ObjectExtensionManager objectExtensionManager, - Type objectType, - Type propertyType, - string propertyName, - Action propertyBuildAction) + [NotNull] this ObjectExtensionManager objectExtensionManager, + [NotNull] Type entityType, + [NotNull] Type propertyType, + [NotNull] string propertyName, + [CanBeNull] Action propertyBuildAction = null) { + Check.NotNull(objectExtensionManager, nameof(objectExtensionManager)); + return objectExtensionManager.AddOrUpdateProperty( - objectType, + entityType, propertyType, propertyName, options => @@ -40,34 +44,37 @@ namespace Volo.Abp.ObjectExtending ); } - public static void ConfigureEfCoreEntity( - this ObjectExtensionManager objectExtensionManager, - EntityTypeBuilder b) - { - var objectExtension = objectExtensionManager.GetOrNull(b.Metadata.ClrType); - if (objectExtension == null) + public static void ConfigureEfCoreEntity( + [NotNull] this ObjectExtensionManager objectExtensionManager, + [NotNull] EntityTypeBuilder typeBuilder) { - return; - } + Check.NotNull(objectExtensionManager, nameof(objectExtensionManager)); + Check.NotNull(typeBuilder, nameof(typeBuilder)); - foreach (var property in objectExtension.GetProperties()) - { - var efCoreMapping = property.GetEfCoreMappingOrNull(); - if (efCoreMapping == null) + var objectExtension = objectExtensionManager.GetOrNull(typeBuilder.Metadata.ClrType); + if (objectExtension == null) { - continue; + return; } - /* Prevent multiple calls to the entityTypeBuilder.Property(...) method */ - if (b.Metadata.FindProperty(property.Name) != null) + foreach (var property in objectExtension.GetProperties()) { - continue; - } + var efCoreMapping = property.GetEfCoreMappingOrNull(); + if (efCoreMapping == null) + { + continue; + } + + /* Prevent multiple calls to the entityTypeBuilder.Property(...) method */ + if (typeBuilder.Metadata.FindProperty(property.Name) != null) + { + continue; + } - var propertyBuilder = b.Property(property.Type, property.Name); + var propertyBuilder = typeBuilder.Property(property.Type, property.Name); - efCoreMapping.PropertyBuildAction?.Invoke(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 e76edb167a..fda5d88ceb 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/ObjectExtending/EfCoreObjectExtensionPropertyInfoExtensions.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/ObjectExtending/EfCoreObjectExtensionPropertyInfoExtensions.cs @@ -9,6 +9,7 @@ namespace Volo.Abp.ObjectExtending { public const string EfCorePropertyConfigurationName = "EfCoreMapping"; + [NotNull] public static ObjectExtensionPropertyInfo MapEfCore( [NotNull] this ObjectExtensionPropertyInfo propertyExtension, [CanBeNull] Action propertyBuildAction = null) @@ -26,15 +27,24 @@ namespace Volo.Abp.ObjectExtending [CanBeNull] public static ObjectExtensionPropertyInfoEfCoreMappingOptions GetEfCoreMappingOrNull( - this ObjectExtensionPropertyInfo propertyExtension) + [NotNull] this ObjectExtensionPropertyInfo propertyExtension) { - return propertyExtension.Configuration.GetOrDefault(EfCorePropertyConfigurationName) + Check.NotNull(propertyExtension, nameof(propertyExtension)); + + return propertyExtension + .Configuration + .GetOrDefault(EfCorePropertyConfigurationName) as ObjectExtensionPropertyInfoEfCoreMappingOptions; } - public static bool IsMappedToFieldForEfCore(this ObjectExtensionPropertyInfo propertyExtension) + public static bool IsMappedToFieldForEfCore( + [NotNull] this ObjectExtensionPropertyInfo propertyExtension) { - return propertyExtension.Configuration.ContainsKey(EfCorePropertyConfigurationName); + Check.NotNull(propertyExtension, nameof(propertyExtension)); + + return propertyExtension + .Configuration + .ContainsKey(EfCorePropertyConfigurationName); } } } 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 0c9909f5d7..4189c87962 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/ObjectExtending/ObjectExtensionPropertyInfoEfCoreMappingOptions.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/ObjectExtending/ObjectExtensionPropertyInfoEfCoreMappingOptions.cs @@ -20,6 +20,7 @@ namespace Volo.Abp.ObjectExtending [CanBeNull] Action propertyBuildAction = null) { ExtensionProperty = Check.NotNull(extensionProperty, nameof(extensionProperty)); + PropertyBuildAction = propertyBuildAction; } }