Browse Source

Merge pull request #4893 from abpframework/maliming/MapEfCoreProperty

Use EntityTypeBuilder & PropertyBuilder in the MapEfCoreProperty method.
pull/5022/head
Halil İbrahim Kalkan 6 years ago
committed by GitHub
parent
commit
cbbf56c66b
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 34
      framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/ObjectExtending/EfCoreObjectExtensionInfoExtensions.cs
  2. 37
      framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/ObjectExtending/EfCoreObjectExtensionManagerExtensions.cs
  3. 16
      framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/ObjectExtending/EfCoreObjectExtensionPropertyInfoExtensions.cs
  4. 11
      framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/ObjectExtending/ObjectExtensionPropertyInfoEfCoreMappingOptions.cs
  5. 21
      framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/Domain/ExtraProperties_Tests.cs
  6. 7
      framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/Domain/TestEntityExtensionConfigurator.cs

34
framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/ObjectExtending/EfCoreObjectExtensionInfoExtensions.cs

@ -37,5 +37,37 @@ namespace Volo.Abp.ObjectExtending
} }
); );
} }
public static ObjectExtensionInfo MapEfCoreProperty<TProperty>(
[NotNull] this ObjectExtensionInfo objectExtensionInfo,
[NotNull] string propertyName,
[CanBeNull] Action<EntityTypeBuilder, PropertyBuilder> entityTypeAndPropertyBuildAction)
{
return objectExtensionInfo.MapEfCoreProperty(
typeof(TProperty),
propertyName,
entityTypeAndPropertyBuildAction
);
}
public static ObjectExtensionInfo MapEfCoreProperty(
[NotNull] this ObjectExtensionInfo objectExtensionInfo,
[NotNull] Type propertyType,
[NotNull] string propertyName,
[CanBeNull] Action<EntityTypeBuilder, PropertyBuilder> entityTypeAndPropertyBuildAction)
{
Check.NotNull(objectExtensionInfo, nameof(objectExtensionInfo));
return objectExtensionInfo.AddOrUpdateProperty(
propertyType,
propertyName,
options =>
{
options.MapEfCore(
entityTypeAndPropertyBuildAction
);
}
);
}
} }
} }

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

@ -44,6 +44,42 @@ namespace Volo.Abp.ObjectExtending
); );
} }
public static ObjectExtensionManager MapEfCoreProperty<TEntity, TProperty>(
[NotNull] this ObjectExtensionManager objectExtensionManager,
[NotNull] string propertyName,
[CanBeNull] Action<EntityTypeBuilder, PropertyBuilder> 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<EntityTypeBuilder, PropertyBuilder> entityTypeAndPropertyBuildAction = null)
{
Check.NotNull(objectExtensionManager, nameof(objectExtensionManager));
return objectExtensionManager.AddOrUpdateProperty(
entityType,
propertyType,
propertyName,
options =>
{
options.MapEfCore(
entityTypeAndPropertyBuildAction
);
}
);
}
public static void ConfigureEfCoreEntity( public static void ConfigureEfCoreEntity(
[NotNull] this ObjectExtensionManager objectExtensionManager, [NotNull] this ObjectExtensionManager objectExtensionManager,
[NotNull] EntityTypeBuilder typeBuilder) [NotNull] EntityTypeBuilder typeBuilder)
@ -73,6 +109,7 @@ namespace Volo.Abp.ObjectExtending
var propertyBuilder = typeBuilder.Property(property.Type, property.Name); var propertyBuilder = typeBuilder.Property(property.Type, property.Name);
efCoreMapping.EntityTypeAndPropertyBuildAction?.Invoke(typeBuilder, propertyBuilder);
efCoreMapping.PropertyBuildAction?.Invoke(propertyBuilder); efCoreMapping.PropertyBuildAction?.Invoke(propertyBuilder);
} }
} }

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

@ -25,6 +25,22 @@ namespace Volo.Abp.ObjectExtending
return propertyExtension; return propertyExtension;
} }
[NotNull]
public static ObjectExtensionPropertyInfo MapEfCore(
[NotNull] this ObjectExtensionPropertyInfo propertyExtension,
[CanBeNull] Action<EntityTypeBuilder, PropertyBuilder> entityTypeAndPropertyBuildAction = null)
{
Check.NotNull(propertyExtension, nameof(propertyExtension));
propertyExtension.Configuration[EfCorePropertyConfigurationName] =
new ObjectExtensionPropertyInfoEfCoreMappingOptions(
propertyExtension,
entityTypeAndPropertyBuildAction: entityTypeAndPropertyBuildAction
);
return propertyExtension;
}
[CanBeNull] [CanBeNull]
public static ObjectExtensionPropertyInfoEfCoreMappingOptions GetEfCoreMappingOrNull( public static ObjectExtensionPropertyInfoEfCoreMappingOptions GetEfCoreMappingOrNull(
[NotNull] this ObjectExtensionPropertyInfo propertyExtension) [NotNull] this ObjectExtensionPropertyInfo propertyExtension)

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

@ -15,13 +15,18 @@ namespace Volo.Abp.ObjectExtending
[CanBeNull] [CanBeNull]
public Action<PropertyBuilder> PropertyBuildAction { get; set; } public Action<PropertyBuilder> PropertyBuildAction { get; set; }
[CanBeNull]
public Action<EntityTypeBuilder, PropertyBuilder> EntityTypeAndPropertyBuildAction { get; set; }
public ObjectExtensionPropertyInfoEfCoreMappingOptions( public ObjectExtensionPropertyInfoEfCoreMappingOptions(
[NotNull] ObjectExtensionPropertyInfo extensionProperty, [NotNull] ObjectExtensionPropertyInfo extensionProperty,
[CanBeNull] Action<PropertyBuilder> propertyBuildAction = null) [CanBeNull] Action<PropertyBuilder> propertyBuildAction = null,
[CanBeNull] Action<EntityTypeBuilder, PropertyBuilder> entityTypeAndPropertyBuildAction = null)
{ {
ExtensionProperty = Check.NotNull(extensionProperty, nameof(extensionProperty)); ExtensionProperty = Check.NotNull(extensionProperty, nameof(extensionProperty));
PropertyBuildAction = propertyBuildAction; PropertyBuildAction = propertyBuildAction;
EntityTypeAndPropertyBuildAction = entityTypeAndPropertyBuildAction;
} }
} }
} }

21
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 Shouldly;
using Volo.Abp.Data; using Volo.Abp.Data;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.TestApp.Domain;
using Volo.Abp.TestApp.Testing; using Volo.Abp.TestApp.Testing;
using Xunit; using Xunit;
@ -28,5 +32,20 @@ namespace Volo.Abp.EntityFrameworkCore.Domain
var london2 = await CityRepository.FindByNameAsync("London"); var london2 = await CityRepository.FindByNameAsync("London");
london2.GetProperty<string>("PhoneCode").ShouldBe("53"); london2.GetProperty<string>("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;
});
}
} }
} }

7
framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/Domain/TestEntityExtensionConfigurator.cs

@ -15,8 +15,11 @@ namespace Volo.Abp.EntityFrameworkCore.Domain
ObjectExtensionManager.Instance ObjectExtensionManager.Instance
.MapEfCoreProperty<City, string>( .MapEfCoreProperty<City, string>(
"PhoneCode", "PhoneCode",
p => p.HasMaxLength(8) (e, p) =>
); {
e.HasIndex(p.Metadata.Name).IsUnique();
p.HasMaxLength(8);
});
}); });
} }
} }

Loading…
Cancel
Save