From 229f6b2d8c4428178b83b045ee7b63dbcf5a92b1 Mon Sep 17 00:00:00 2001 From: xuejiaming <326308290@qq.com> Date: Fri, 22 Oct 2021 23:19:43 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81abp.vnext?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AbstractShardingAbpDbContext.cs | 47 +++++++++++++++++-- samples/Samples.AbpSharding/IShardingKeyId.cs | 11 +++++ .../IShardingKeyIsCreationTime.cs | 11 +++++ .../Extensions/ObjectExtension.cs | 4 ++ 4 files changed, 70 insertions(+), 3 deletions(-) create mode 100644 samples/Samples.AbpSharding/IShardingKeyId.cs create mode 100644 samples/Samples.AbpSharding/IShardingKeyIsCreationTime.cs diff --git a/samples/Samples.AbpSharding/AbstractShardingAbpDbContext.cs b/samples/Samples.AbpSharding/AbstractShardingAbpDbContext.cs index 5a1c4c0c..e73e07ac 100644 --- a/samples/Samples.AbpSharding/AbstractShardingAbpDbContext.cs +++ b/samples/Samples.AbpSharding/AbstractShardingAbpDbContext.cs @@ -6,16 +6,21 @@ using ShardingCore.Sharding.Abstractions; using ShardingCore.Sharding.ShardingDbContextExecutors; using System; using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; using System.Linq; using System.Threading; using System.Threading.Tasks; using ShardingCore.EFCores.OptionsExtensions; +using ShardingCore.Helpers; +using ShardingCore.Utils; +using Volo.Abp.Domain.Entities; using Volo.Abp.EntityFrameworkCore; +using Volo.Abp.Reflection; namespace Samples.AbpSharding { - public abstract class AbstractShardingAbpDbContext : AbpDbContext, IShardingDbContext, ISupportShardingTransaction, ISupportShardingReadWrite - where TDbContext:DbContext + public abstract class AbstractShardingAbpDbContext : AbpDbContext, IShardingDbContext, ISupportShardingTransaction, ISupportShardingReadWrite + where TDbContext : DbContext { private readonly IShardingDbContextExecutor _shardingDbContextExecutor; protected AbstractShardingAbpDbContext(DbContextOptions options) : base(options) @@ -61,7 +66,7 @@ namespace Samples.AbpSharding public DbContext GetDbContext(string dataSourceName, bool parallelQuery, IRouteTail routeTail) { var dbContext = _shardingDbContextExecutor.CreateDbContext(parallelQuery, dataSourceName, routeTail); - if (!parallelQuery&& dbContext is AbstractShardingAbpDbContext abstractShardingAbpDbContext) + if (!parallelQuery && dbContext is AbstractShardingAbpDbContext abstractShardingAbpDbContext) { abstractShardingAbpDbContext.LazyServiceProvider = this.LazyServiceProvider; } @@ -77,9 +82,45 @@ namespace Samples.AbpSharding /// public DbContext CreateGenericDbContext(TEntity entity) where TEntity : class { + CheckAndSetShardingKeyThatSupportAutoCreate(entity); return _shardingDbContextExecutor.CreateGenericDbContext(entity); } + private void CheckAndSetShardingKeyThatSupportAutoCreate(TEntity entity) where TEntity : class + { + if (entity is IShardingKeyIsGuId) + { + + if (entity is IEntity guidEntity) + { + if (guidEntity.Id != default) + { + return; + } + var idProperty = entity.GetProperty(nameof(IEntity.Id)); + + var dbGeneratedAttr = ReflectionHelper + .GetSingleAttributeOrDefault( + idProperty + ); + + if (dbGeneratedAttr != null && dbGeneratedAttr.DatabaseGeneratedOption != DatabaseGeneratedOption.None) + { + return; + } + + EntityHelper.TrySetId( + guidEntity, + () => GuidGenerator.Create(), + true + ); + } + }else if (entity is IShardingKeyIsCreationTime) + { + AuditPropertySetter?.SetCreationProperties(entity); + } + } + public override EntityEntry Add(object entity) { diff --git a/samples/Samples.AbpSharding/IShardingKeyId.cs b/samples/Samples.AbpSharding/IShardingKeyId.cs new file mode 100644 index 00000000..5ad66775 --- /dev/null +++ b/samples/Samples.AbpSharding/IShardingKeyId.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace Samples.AbpSharding +{ + public interface IShardingKeyIsGuId + { + } +} diff --git a/samples/Samples.AbpSharding/IShardingKeyIsCreationTime.cs b/samples/Samples.AbpSharding/IShardingKeyIsCreationTime.cs new file mode 100644 index 00000000..e7c7822b --- /dev/null +++ b/samples/Samples.AbpSharding/IShardingKeyIsCreationTime.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace Samples.AbpSharding +{ + public interface IShardingKeyIsCreationTime + { + } +} diff --git a/src/ShardingCore/Extensions/ObjectExtension.cs b/src/ShardingCore/Extensions/ObjectExtension.cs index 6803d22b..1ca62c20 100644 --- a/src/ShardingCore/Extensions/ObjectExtension.cs +++ b/src/ShardingCore/Extensions/ObjectExtension.cs @@ -72,6 +72,10 @@ namespace ShardingCore.Extensions return null; } } + public static PropertyInfo GetProperty(this object obj, string propertyName) + { + return obj.GetType().GetProperty(propertyName, _bindingFlags); + } /// /// 类型X是否包含某个属性 ///