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; }
}
}