using DW5S.Entity; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Conventions; using Microsoft.Extensions.Logging; using System.Configuration; namespace DW5S.Repostory { public class OracleContext : DbContext { public OracleContext() { //发布为单文件后找不到Microsoft.EntityFrameworkCore.Relational.dll,需要将这个dll拷贝到AddIns中 } public async Task ExecuteSqlAsync(string sql) { await this.Database.ExecuteSqlRawAsync(sql); } /// /// 执行SQL查询(查询最大ID需要给int?等可空类型,否则会出错) /// /// /// /// public async Task> SqlQuery(string sql) { var res = await this.Database.SqlQueryRaw(sql).ToListAsync(); return res; } /// /// 更新所有表的序列值为对应表的最大ID(更新后需要重新编译触发器) /// public void UpdateSeq() { List tables = new List(); var props = typeof(OracleContext).GetProperties().Where(p => p.PropertyType.Name.StartsWith("DbSet")).ToList(); foreach (var item in props) { var tb = item.PropertyType.GetGenericArguments().First().Name.ToUpper(); tables.Add(tb); } foreach (var tb in tables) { try { int? idMax = this.SqlQuery($"select max(id) from {tb}").Result.FirstOrDefault(); if (idMax == null) idMax = 1; string sql = $"DROP SEQUENCE SQ_{tb}"; this.ExecuteSqlAsync(sql).Wait(); sql = $"CREATE SEQUENCE SQ_{tb} INCREMENT BY 1 START WITH {idMax}"; this.ExecuteSqlAsync(sql).Wait(); } catch (Exception ex) { Console.WriteLine(ex.Message); } } } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { var conStr = ConfigurationManager.ConnectionStrings["OracleCon"].ToString(); Console.WriteLine($"conStr={conStr}"); optionsBuilder.UseOracle(conStr, options => { //options.MigrationsAssembly("Ips.Sps.Repostory"); //options.UseOracleSQLCompatibility("11");//11=Oracle11g,12=Oracle12c,EFCore8不支持老版数据库了 //使用全局拆分查询,将带集合导航的查询拆分为多条SQL执行,避免结果发生笛卡尔爆炸 options.UseQuerySplittingBehavior(QuerySplittingBehavior.SplitQuery); //true:生成数据库null语意,如 select * from Products where Name is null; //false:生成c# null语意,如 select * from Products where Name = null; //options.UseRelationalNulls(true); }) //.UseSnakeCaseNamingConvention()//FullName->full_name //.UseLowerCaseNamingConvention()//FullName->fullname //.UseUpperSnakeCaseNamingConvention()// FullName->FULL_NAME .UseUpperCaseNamingConvention();//FullName->FULLNAME //sql语句输出到日志文件 var loggerFactory = new LoggerFactory(); loggerFactory.AddProvider(new SqlLoggerProvider()); optionsBuilder.UseLoggerFactory(loggerFactory); base.OnConfiguring(optionsBuilder); } protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder) { //EFCore默认表名会带上复数形式,通过这句话删除复数约定 configurationBuilder.Conventions.Remove(typeof(TableNameFromDbSetConvention)); } protected override void OnModelCreating(ModelBuilder modelBuilder) { //在Oracle11g中列名、索引、字段、表名、序列、触发器等名称长度均不能超过30个字符 //自动生成的超出30个字符的需要在下面自定义 modelBuilder.Entity().HasOne(p => p.StationRes).WithMany() .HasConstraintName("FK_CGRES_STATIONRESID"); modelBuilder.Entity().HasOne(p => p.SigInfo).WithOne() .HasConstraintName("FK_SAMPLEINFO_SIGINFOID"); modelBuilder.Entity().HasOne(p => p.StationRes).WithOne() .HasConstraintName("FK_POSRES_STATIONRESID"); modelBuilder.Entity().HasOne(p => p.TargetInfo).WithOne() .HasConstraintName("FK_POSRES_TARGETINFOID"); modelBuilder.Entity().HasOne(p => p.SampleInfo).WithOne() .HasConstraintName("FK_REFTASKFREQ_SAMPLEINFOID"); modelBuilder.Entity().HasOne(p => p.SatInfo).WithOne() .HasConstraintName("FK_REFTASKFREQ_SATINFOID"); modelBuilder.Entity().HasIndex(p => new { p.Module, p.LogTime, p.LogType }) .HasDatabaseName("IX_LOGRES_MODULE_TIME_TYPE"); modelBuilder.Entity().HasIndex(p => new { p.FileTime, p.FrequpHz, p.YbSnr }) .HasDatabaseName("IX_REFCGRES_TIME_FREQ_SNR"); modelBuilder.Entity().HasIndex(p => new { p.TaskID, p.SigTime, p.FrequpHz }) .HasDatabaseName("IX_CGRES_TASKID_TIME_FREQ"); modelBuilder.Entity().HasIndex(p => new { p.TaskID, p.SigTime, p.FrequpHz }) .HasDatabaseName("IX_POSRES_TASKID_TIME_FREQ"); } public DbSet XlInfos { set; get; } public DbSet TaskTemplates { set; get; } public DbSet TaskInfos { set; get; } public DbSet TaskSigs { set; get; } public DbSet TxInfos { get; set; } public DbSet AdCards { get; set; } public DbSet AdChannels { get; set; } public DbSet SatInfos { get; set; } public DbSet FixedStation { get; set; } public DbSet SigInfos { get; set; } public DbSet SigDelays { get; set; } public DbSet TargetInfos { get; set; } public DbSet SysSetings { get; set; } public DbSet TaskRunnningInfos { get; set; } public DbSet SampleInfos { get; set; } public DbSet RefTaskFreqs { get; set; } /*以下是Range分区表的DbSet*/ public DbSet AdRes { get; set; } public DbSet LogRes { set; get; } public DbSet StationRes { get; set; } public DbSet CxRes { get; set; } public DbSet CgRes { get; set; } public DbSet RefCgRes { get; set; } public DbSet CgXgfRes { get; set; } public DbSet PosRes { get; set; } public DbSet CheckRes { get; set; } } }