实体框架核心编写MSSQL服务器扩展属性

时间:2017-07-21 11:19:51

标签: sql-server entity-framework-core extended-properties

是否可以通过Fluent-API或DataAnnotation为表/架构创建特定于MSSQL Server的扩展属性?我想将我的文档包含在sql server表中以满足我们的DBA。

亲切的问候

1 个答案:

答案 0 :(得分:0)

我开始使用EntityFrameworkCore.Scaffolding.Handlebars实现,但时间用完了。这些是发现:

添加

    public class ScaffoldingDesignTimeServices : IDesignTimeServices
    {
        public void ConfigureDesignTimeServices(IServiceCollection services)
        {
            services.AddSingleton<IDatabaseModelFactory, SqlServerDatabaseModelFactory2>();

            var options = ReverseEngineerOptions.DbContextAndEntities;

            services.AddHandlebarsScaffolding(options);

            // https://github.com/TrackableEntities/EntityFrameworkCore.Scaffolding.Handlebars/issues/30
            Handlebars.RegisterHelper("f-pn", FormatPropertyName);
        }

        void FormatPropertyName(TextWriter writer, object context, object[] args)
        {
            writer.WriteSafeString(args[0].ToString());
        }
    }

从中复制SqlServerDatabaseModelFactory SqlServerDatabaseModelFactory并使用类似这样的功能对其进行自定义

    DbConnection connection,
    IReadOnlyList<DatabaseTable> tables,
    string tableFilter,
    IReadOnlyDictionary<string, (string storeType, string typeName)> typeAliases)
        {
            using (var command = connection.CreateCommand())
            {
                var commandText = @"
SELECT      u.name AS [table_schema],
            t.name AS [table_name],
            td.value AS [table_desc],
            c.name AS [column_name],
            cd.value AS [column_desc]
FROM        sysobjects t
INNER JOIN  sysusers u
    ON      u.uid = t.uid
LEFT OUTER JOIN sys.extended_properties td
    ON      td.major_id = t.id
    AND     td.minor_id = 0
    AND     td.name = 'MS_Description'
INNER JOIN  syscolumns c
    ON      c.id = t.id
LEFT OUTER JOIN sys.extended_properties cd
    ON      cd.major_id = c.id
    AND     cd.minor_id = c.colid
    AND     cd.name = 'MS_Description'
WHERE t.type = 'u'
ORDER BY    t.name, c.colorder";

                command.CommandText = commandText;

                using (var reader = command.ExecuteReader())
                {
                    var tableColumnGroups = reader.Cast<DbDataRecord>()
                        .GroupBy(
                            ddr => (tableSchema: ddr.GetValueOrDefault<string>("table_schema"),
                                tableName: ddr.GetValueOrDefault<string>("table_name")));

                    foreach (var tableColumnGroup in tableColumnGroups)
                    {
                        var tableSchema = tableColumnGroup.Key.tableSchema;
                        var tableName = tableColumnGroup.Key.tableName;

                        var table = tables.Single(t => t.Schema == tableSchema && t.Name == tableName);

                        foreach (var dataRecord in tableColumnGroup)
                        {
                            var columnName = dataRecord.GetValueOrDefault<string>("column_name");
                            var tableDesc = dataRecord.GetValueOrDefault<string>("table_desc");
                            var columnDesc = dataRecord.GetValueOrDefault<string>("column_desc");

                            //_logger.ColumnFound(
                            //    DisplayName(tableSchema, tableName),
                            //    columnName,
                            //    ordinal,
                            //    DisplayName(dataTypeSchemaName, dataTypeName),
                            //    maxLength,
                            //    precision,
                            //    scale,
                            //    nullable,
                            //    isIdentity,
                            //    defaultValue,
                            //    computedValue);

                            table.Description = tableDesc; ???

                            table.Columns.FirstOrDefault(x => x.Name == columnName)?.Description = columnDesc; ???;
                        }
                    }
                }
            }
        }

制作表和列说明的字典,并使用车把帮助器/变形器EntityFrameworkCore.Scaffolding.Handlebars