namespace Framework.Cli.Generate { using Framework.Config; using Microsoft.EntityFrameworkCore; using System.Linq; /// /// Meta information about sql schema. /// internal class MetaSql { /// /// Constructor runs Schema.sql. /// /// For internal use only. public MetaSql(bool isFrameworkDb) { MetaSqlDbContext dbContext = new MetaSqlDbContext(isFrameworkDb); string sql = UtilFramework.FileLoad(UtilFramework.FolderName + "Framework/Framework.Cli/Generate/Sql/Schema.sql"); this.List = dbContext.Schema.FromSqlRaw(sql).ToArray(); // Schema changes can cause timeout. Run sql command "exec sp_updatestats" on master database. If "select * from sys.columns" is slow, free up some memory. // // For Application filter out "dbo.Framework" tables. if (isFrameworkDb == false) { this.List = this.List.Where(item => !(item.SchemaName == "dbo" && item.TableName.StartsWith("Framework"))).ToArray(); } else { this.List = this.List.Where(item => (item.SchemaName == "dbo" && item.TableName.StartsWith("Framework"))).ToArray(); } // Filter out "sysdiagrams" table. this.List = this.List.Where(item => item.IsSystemTable == false).ToArray(); } public readonly MetaSqlSchema[] List; } /// /// DbContext used to query database schema. /// internal class MetaSqlDbContext : DbContext { public MetaSqlDbContext(bool isFrameworkDb) { this.IsFrameworkDb = isFrameworkDb; } public readonly bool IsFrameworkDb; protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { string connectionString = ConfigServer.ConnectionString(IsFrameworkDb); UtilFramework.Assert(string.IsNullOrEmpty(connectionString) == false, "ConnectionString is null!"); optionsBuilder.UseSqlServer(connectionString); optionsBuilder.UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking); } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity().HasNoKey(); } public DbSet Schema { get; set; } } /// /// See also file Sql\Schema.sql /// internal class MetaSqlSchema { public string SchemaName { get; internal set; } /// /// Gets TableName. For example: "Raw.Wikipedia.Aircraft". See also property MetaCSharpSchema.TableNameCSharp. /// public string TableName { get; internal set; } public string FieldName { get; internal set; } public int FieldNameSort { get; internal set; } public bool IsView { get; internal set; } public byte SqlType { get; internal set; } public bool IsNullable { get; internal set; } public bool IsPrimaryKey { get; internal set; } public bool IsSystemTable { get; internal set; } } }