Browse Source

Refactor EF Core entity extensions.

pull/3401/head
Halil İbrahim Kalkan 6 years ago
parent
commit
01d2ea0b00
  1. 2
      framework/src/Volo.Abp.Core/Volo/Abp/Check.cs
  2. 71
      framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/ObjectExtending/EfCoreObjectExtensionManagerExtensions.cs
  3. 18
      framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/ObjectExtending/EfCoreObjectExtensionPropertyInfoExtensions.cs
  4. 1
      framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/ObjectExtending/ObjectExtensionPropertyInfoEfCoreMappingOptions.cs

2
framework/src/Volo.Abp.Core/Volo/Abp/Check.cs

@ -130,7 +130,7 @@ namespace Volo.Abp
if (!type.IsAssignableTo<TBaseType>()) if (!type.IsAssignableTo<TBaseType>())
{ {
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; return type;

71
framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/ObjectExtending/EfCoreObjectExtensionManagerExtensions.cs

@ -1,19 +1,21 @@
using System; using System;
using JetBrains.Annotations;
using Microsoft.EntityFrameworkCore.Metadata.Builders; using Microsoft.EntityFrameworkCore.Metadata.Builders;
using Volo.Abp.Data; using Volo.Abp.Data;
using Volo.Abp.Domain.Entities;
namespace Volo.Abp.ObjectExtending namespace Volo.Abp.ObjectExtending
{ {
public static class EfCoreObjectExtensionManagerExtensions public static class EfCoreObjectExtensionManagerExtensions
{ {
public static ObjectExtensionManager MapEfCoreProperty<TObject, TProperty>( public static ObjectExtensionManager MapEfCoreProperty<TEntity, TProperty>(
this ObjectExtensionManager objectExtensionManager, [NotNull] this ObjectExtensionManager objectExtensionManager,
string propertyName, [NotNull] string propertyName,
Action<PropertyBuilder> propertyBuildAction) [CanBeNull] Action<PropertyBuilder> propertyBuildAction = null)
where TObject : IHasExtraProperties where TEntity : IHasExtraProperties, IEntity
{ {
return objectExtensionManager.MapEfCoreProperty( return objectExtensionManager.MapEfCoreProperty(
typeof(TObject), typeof(TEntity),
typeof(TProperty), typeof(TProperty),
propertyName, propertyName,
propertyBuildAction propertyBuildAction
@ -21,14 +23,16 @@ namespace Volo.Abp.ObjectExtending
} }
public static ObjectExtensionManager MapEfCoreProperty( public static ObjectExtensionManager MapEfCoreProperty(
this ObjectExtensionManager objectExtensionManager, [NotNull] this ObjectExtensionManager objectExtensionManager,
Type objectType, [NotNull] Type entityType,
Type propertyType, [NotNull] Type propertyType,
string propertyName, [NotNull] string propertyName,
Action<PropertyBuilder> propertyBuildAction) [CanBeNull] Action<PropertyBuilder> propertyBuildAction = null)
{ {
Check.NotNull(objectExtensionManager, nameof(objectExtensionManager));
return objectExtensionManager.AddOrUpdateProperty( return objectExtensionManager.AddOrUpdateProperty(
objectType, entityType,
propertyType, propertyType,
propertyName, propertyName,
options => options =>
@ -40,34 +44,37 @@ namespace Volo.Abp.ObjectExtending
); );
} }
public static void ConfigureEfCoreEntity( public static void ConfigureEfCoreEntity(
this ObjectExtensionManager objectExtensionManager, [NotNull] this ObjectExtensionManager objectExtensionManager,
EntityTypeBuilder b) [NotNull] EntityTypeBuilder typeBuilder)
{
var objectExtension = objectExtensionManager.GetOrNull(b.Metadata.ClrType);
if (objectExtension == null)
{ {
return; Check.NotNull(objectExtensionManager, nameof(objectExtensionManager));
} Check.NotNull(typeBuilder, nameof(typeBuilder));
foreach (var property in objectExtension.GetProperties()) var objectExtension = objectExtensionManager.GetOrNull(typeBuilder.Metadata.ClrType);
{ if (objectExtension == null)
var efCoreMapping = property.GetEfCoreMappingOrNull();
if (efCoreMapping == null)
{ {
continue; return;
} }
/* Prevent multiple calls to the entityTypeBuilder.Property(...) method */ foreach (var property in objectExtension.GetProperties())
if (b.Metadata.FindProperty(property.Name) != null)
{ {
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);
}
} }
} }
} }
}

18
framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/ObjectExtending/EfCoreObjectExtensionPropertyInfoExtensions.cs

@ -9,6 +9,7 @@ namespace Volo.Abp.ObjectExtending
{ {
public const string EfCorePropertyConfigurationName = "EfCoreMapping"; public const string EfCorePropertyConfigurationName = "EfCoreMapping";
[NotNull]
public static ObjectExtensionPropertyInfo MapEfCore( public static ObjectExtensionPropertyInfo MapEfCore(
[NotNull] this ObjectExtensionPropertyInfo propertyExtension, [NotNull] this ObjectExtensionPropertyInfo propertyExtension,
[CanBeNull] Action<PropertyBuilder> propertyBuildAction = null) [CanBeNull] Action<PropertyBuilder> propertyBuildAction = null)
@ -26,15 +27,24 @@ namespace Volo.Abp.ObjectExtending
[CanBeNull] [CanBeNull]
public static ObjectExtensionPropertyInfoEfCoreMappingOptions GetEfCoreMappingOrNull( 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; 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);
} }
} }
} }

1
framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/ObjectExtending/ObjectExtensionPropertyInfoEfCoreMappingOptions.cs

@ -20,6 +20,7 @@ namespace Volo.Abp.ObjectExtending
[CanBeNull] Action<PropertyBuilder> propertyBuildAction = null) [CanBeNull] Action<PropertyBuilder> propertyBuildAction = null)
{ {
ExtensionProperty = Check.NotNull(extensionProperty, nameof(extensionProperty)); ExtensionProperty = Check.NotNull(extensionProperty, nameof(extensionProperty));
PropertyBuildAction = propertyBuildAction; PropertyBuildAction = propertyBuildAction;
} }
} }

Loading…
Cancel
Save