/// <summary>
        /// 从模型注解添加表和列说明,需要先在OnModelCreating方法调用ConfigDatabaseDescription生成注解
        /// </summary>
        /// <param name="migrationBuilder"></param>
        /// <param name="migration"></param>
        /// <returns></returns>
        public static MigrationBuilder ApplyDatabaseDescription(this MigrationBuilder migrationBuilder, Migration migration)
        {
            var defaultSchema             = "dbo";
            var descriptionAnnotationName = ModelBuilderExtension.DbDescriptionAnnotationName;

            foreach (var entityType in migration.TargetModel.GetEntityTypes())
            {
                //添加表说明
                var tableName = entityType.GetTableName();
                var schema    = entityType.GetSchema();
                var tableDescriptionAnnotation = entityType.FindAnnotation(descriptionAnnotationName);

                if (tableDescriptionAnnotation != null)
                {
                    migrationBuilder.AddOrUpdateTableDescription(
                        tableName,
                        tableDescriptionAnnotation.Value.ToString(),
                        string.IsNullOrEmpty(schema) ? defaultSchema : schema);
                }

                //添加列说明
                foreach (var property in entityType.GetProperties())
                {
                    var columnDescriptionAnnotation = property.FindAnnotation(descriptionAnnotationName);

                    if (columnDescriptionAnnotation != null)
                    {
                        migrationBuilder.AddOrUpdateColumnDescription(
                            tableName,
                            property.GetColumnName(),
                            columnDescriptionAnnotation.Value.ToString(),
                            string.IsNullOrEmpty(schema) ? defaultSchema : schema);
                    }
                }
            }

            return(migrationBuilder);
        }
Exemple #2
0
        /// <summary>
        /// 自动扫描迁移模型并添加表和列说明
        /// </summary>
        /// <param name="migrationBuilder">迁移构造器</param>
        /// <param name="migration">迁移类实例</param>
        /// <param name="entityAssembly">实体类所在程序集</param>
        public static void ApplyDatabaseDescription(this MigrationBuilder migrationBuilder, Migration migration,
                                                    Assembly entityAssembly)
        {
            var defaultSchema = "dbo";

            if (entityAssembly == null)
            {
                throw new NullReferenceException($"{nameof(entityAssembly)} cannot be null.");
            }

            foreach (var entityType in migration.TargetModel.GetEntityTypes().Select(entity =>
                                                                                     new { EntityType = entity, ClrType = entityAssembly.GetType(entity.Name) }))
            {
                //添加表说明
                if (entityType.ClrType?.CustomAttributes.Any(
                        attr => attr.AttributeType == typeof(DbDescriptionAttribute)) == true)
                {
                    migrationBuilder.AddOrUpdateTableDescription(entityType.EntityType.Relational().TableName,
                                                                 (entityType.ClrType.GetCustomAttribute(typeof(DbDescriptionAttribute)) as DbDescriptionAttribute
                                                                 )?.Description, entityType.EntityType.Relational().Schema.IsNullOrEmpty() ? defaultSchema : entityType.EntityType.Relational().Schema);
                }

                //添加列说明
                foreach (var property in entityType.EntityType.GetProperties())
                {
                    if (entityType.ClrType?.GetProperty(property.Name)?.CustomAttributes
                        .Any(attr => attr.AttributeType == typeof(DbDescriptionAttribute)) == true)
                    {
                        //如果该列的实体属性是枚举类型,把枚举的说明追加到列说明
                        var enumDbDescription = string.Empty;
                        if (entityType.ClrType?.GetProperty(property.Name)?.PropertyType.IsEnum == true ||
                            (entityType.ClrType?.GetProperty(property.Name)?.PropertyType
                             .IsDerivedFrom(typeof(Nullable <>)) == true &&
                             entityType.ClrType?.GetProperty(property.Name)?.PropertyType.GenericTypeArguments[0]
                             .IsEnum == true))
                        {
                            var @enum = entityType.ClrType?.GetProperty(property.Name)?.PropertyType
                                        .IsDerivedFrom(typeof(Nullable <>)) == true
                                ? entityType.ClrType?.GetProperty(property.Name)?.PropertyType.GenericTypeArguments[0]
                                : entityType.ClrType?.GetProperty(property.Name)?.PropertyType;

                            var descList = new List <string>();
                            foreach (var field in @enum?.GetFields() ?? new FieldInfo[0])
                            {
                                if (!field.IsSpecialName)
                                {
                                    var desc = (field.GetCustomAttributes(typeof(DbDescriptionAttribute), false)
                                                .FirstOrDefault() as DbDescriptionAttribute)?.Description;
                                    descList.Add(
                                        $@"{field.GetRawConstantValue()} : {(desc.IsNullOrWhiteSpace() ? field.Name : desc)}");
                                }
                            }

                            var isFlags = @enum?.GetCustomAttribute(typeof(FlagsAttribute)) != null;
                            var enumTypeDbDescription =
                                (@enum?.GetCustomAttributes(typeof(DbDescriptionAttribute), false).FirstOrDefault() as
                                 DbDescriptionAttribute)?.Description;
                            enumTypeDbDescription += enumDbDescription + (isFlags ? " [是标志位枚举]" : string.Empty);
                            enumDbDescription      =
                                $@"( {(enumTypeDbDescription.IsNullOrWhiteSpace() ? "" : $@"{enumTypeDbDescription}; ")}{string.Join("; ", descList)} )";
                        }

                        migrationBuilder.AddOrUpdateColumnDescription(entityType.EntityType.Relational().TableName,
                                                                      property.Relational().ColumnName,
                                                                      $@"{(entityType.ClrType?.GetProperty(property.Name)
                                    ?.GetCustomAttribute(typeof(DbDescriptionAttribute)) as DbDescriptionAttribute)
                                ?.Description}{(enumDbDescription.IsNullOrWhiteSpace() ? "" : $@" {enumDbDescription}")}"