using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Linq;
using DW5S.Entity;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Conventions;
using Microsoft.Extensions.Logging;
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
})
//.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)
{
}
public DbSet XlInfos { set; get; }
public DbSet TaskInfos { set; get; }
public DbSet TaskSigs { set; get; }
public DbSet TxInfos { 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 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; }
}
}