sunpengfei
2025-08-04 91a2e02189f94545e12a97f930dde793084ad24f
FlexJobApi.Core/Utils/DbUtils/DbUtils.cs
@@ -18,38 +18,27 @@
    public static class DbUtils
    {
        /// <summary>
        /// 生成实体注释
        /// 生成实体
        /// </summary>
        /// <param name="modelBuilder"></param>
        /// <param name="dbContextLocator"></param>
        /// <returns></returns>
        public static async Task BuildEntityComment(ModelBuilder modelBuilder, Type dbContextLocator = null)
        public static async Task BuildEntity(ModelBuilder modelBuilder, Type dbContextLocator = null)
        {
            var xmlDoc = await XmlDocUtils.GetXmlDocAsync();
            var entityTypes = App.Assemblies
                .Where(it => it.FullName.Contains("FlexJob"))
                .SelectMany(it => it.GetTypes())
                .Where(it =>
                    it.IsClass
                    && !it.IsAbstract
                    && typeof(IPrivateEntity).IsAssignableFrom(it)
                    && (dbContextLocator == null
                    ? it.BaseType == typeof(CommonEntity)
                    : it.BaseType.GenericTypeArguments.Any(it => it == dbContextLocator)))
                .ToList();
            foreach (var entityType in entityTypes)
            foreach (var entityType in modelBuilder.Model.GetEntityTypes())
            {
                Console.WriteLine($"正在生成表:{entityType.Name}");
                // 获取实体类的XML注释,并设置为表注释
                var entityBuilder = modelBuilder.Entity(entityType);
                string typeComment = (await entityType.GetXmlDocMemberAsync(xmlDoc))?.Summary;
                var entityBuilder = modelBuilder.Entity(entityType.ClrType);
                string typeComment = (await entityType.ClrType.GetXmlDocMemberAsync(xmlDoc))?.Summary;
                if (!string.IsNullOrEmpty(typeComment))
                {
                    Console.WriteLine($"正在生成表注释:{entityType.Name}-{typeComment}");
                    entityBuilder.ToTable(it => it.HasComment(typeComment));
                }
                // 获取实体属性的XML注释,并设置为列注释
                var properties = entityType.GetProperties()
                var properties = entityType.ClrType.GetProperties()
                    .Where(p =>
                        p.CanRead
                        && p.CanWrite
@@ -63,6 +52,19 @@
                        Console.WriteLine($"正在生成属性注释:{property.Name}-{propComment}");
                        entityBuilder.Property(property.Name).HasComment(propComment);
                    }
                }
                if (typeof(CommonEntity).IsAssignableFrom(entityType.ClrType))
                {
                    // 构建筛选条件:IsDeleted == false
                    var parameter = Expression.Parameter(entityType.ClrType, "e");
                    var property = Expression.Property(parameter, "IsDeleted");
                    var constant = Expression.Constant(false);
                    var equal = Expression.Equal(property, constant);
                    var lambda = Expression.Lambda(equal, parameter);
                    // 添加全局筛选器
                    modelBuilder.Entity(entityType.ClrType).HasQueryFilter(lambda);
                }
            }
        }
@@ -101,7 +103,7 @@
                    var prop = entity.Property(nameof(CommonEntity.CreatedTime));
                    if (prop != null && prop.CurrentValue?.ToDateTime() == null)
                    {
                        prop.CurrentValue = DateTime.Now;
                        prop.CurrentValue = DateTimeOffset.Now;
                    }
                    // 生成Id
@@ -118,26 +120,33 @@
                    {
                        prop.CurrentValue = logier?.UserInfoId;
                    }
                    // 赋值跟踪Id
                    prop = entity.Property(nameof(CommonEntity.TraceId));
                    if (prop != null)
                    {
                        prop.CurrentValue = App.GetTraceId();
                    }
                }
                else
                {
                    // 赋值修改日期
                    var prop = entity.Property(nameof(CommonEntity.UpdatedTime));
                    if (prop != null && prop.CurrentValue?.ToDateTime() == null)
                    if (prop != null)
                    {
                        prop.CurrentValue = DateTime.Now;
                        prop.CurrentValue = DateTimeOffset.Now;
                    }
                    // 赋值用户信息Id
                    prop = entity.Property(nameof(CommonEntity.UpdatedUserInfoId));
                    if (prop != null && prop.CurrentValue == null)
                    if (prop != null)
                    {
                        prop.CurrentValue = logier?.UserInfoId;
                    }
                    // 赋值跟踪Id
                    prop = entity.Property(nameof(CommonEntity.TraceId));
                    if (prop != null && prop.CurrentValue == null)
                    if (prop != null)
                    {
                        prop.CurrentValue = App.GetTraceId();
                    }
@@ -148,7 +157,7 @@
                        entity.State = EntityState.Modified;
                        prop = entity.Property(nameof(CommonEntity.IsDeleted));
                        if (prop != null && prop.CurrentValue == null)
                        if (prop != null)
                        {
                            prop.CurrentValue = true;
                        }
@@ -178,7 +187,7 @@
                        : EnumDbAuditOperate.Deleted,
                    TraceId = App.GetTraceId(),
                    CreatedTime = DateTime.Now,
                    CreatedUserInfoId = logier.UserInfoId,
                    CreatedUserInfoId = logier?.UserInfoId,
                });
            }
        }
@@ -190,21 +199,6 @@
                .ToDictionary(p => p.Metadata.Name, p => getOldValues ? p.OriginalValue : p.CurrentValue);
            return JsonConvert.SerializeObject(properties);
        }
        public static void OnCreating(ModelBuilder modelBuilder, EntityTypeBuilder entityBuilder, DbContext dbContext, Type dbContextLocator)
        {
            var metadata = entityBuilder.Metadata;
            var parameter = Expression.Parameter(metadata.ClrType, "e");
            var property = Expression.Property(parameter, nameof(CommonEntity.IsDeleted));
            var falseConstant = Expression.Constant(false, typeof(bool));
            var fakeDeleteQueryFilterExpression = Expression.Lambda(
                Expression.Equal(property, falseConstant),
                parameter
            );
            if (fakeDeleteQueryFilterExpression == null) return;
            entityBuilder.HasQueryFilter(fakeDeleteQueryFilterExpression);
        }
    }
}