You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

93 lines
3.3 KiB

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyModel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Runtime.Loader;
using System.Text;
using VOL.Core.Extensions;
namespace VOL.Core.EFDbContext
{
public abstract class BaseDbContext : DbContext
{
protected abstract string ConnectionString { get; }
public bool QueryTracking
{
set
{
this.ChangeTracker.QueryTrackingBehavior = value ? QueryTrackingBehavior.TrackAll : QueryTrackingBehavior.NoTracking;
}
}
public BaseDbContext() : base() { }
public BaseDbContext(DbContextOptions<BaseDbContext> options) : base(options) { }
protected void UseDbType(DbContextOptionsBuilder optionsBuilder,string connectionString,Enums.DbCurrentType type= Enums.DbCurrentType.Default)
{
if (type == Enums.DbCurrentType.Default)
{
if (Const.DBType.Name == Enums.DbCurrentType.MySql.ToString())
{
//optionsBuilder.UseMySql(connectionString);
optionsBuilder.UseMySql(connectionString, new MySqlServerVersion(new Version(8, 0, 11)));
}
else if (Const.DBType.Name == Enums.DbCurrentType.PgSql.ToString())
{
optionsBuilder.UseNpgsql(connectionString);
}
else
{
optionsBuilder.UseSqlServer(connectionString);
}
}
else
{
if (type == Enums.DbCurrentType.MySql)
{
optionsBuilder.UseMySql(connectionString, new MySqlServerVersion(new Version(8, 0, 11)));
}
else if (type == Enums.DbCurrentType.PgSql)
{
optionsBuilder.UseNpgsql(connectionString);
}
else
{
optionsBuilder.UseSqlServer(connectionString);
}
}
}
protected void OnModelCreating(ModelBuilder modelBuilder, Type type)
{
try
{
//获取所有类库
var compilationLibrary = DependencyContext
.Default
.CompileLibraries
.Where(x => !x.Serviceable && x.Type != "package" && x.Type == "project");
foreach (var _compilation in compilationLibrary)
{
//加载指定类
AssemblyLoadContext.Default
.LoadFromAssemblyName(new AssemblyName(_compilation.Name))
.GetTypes().Where(x => x.GetTypeInfo().BaseType != null
&& x.BaseType == (type)).ToList()
.ForEach(t => { modelBuilder.Entity(t); });
}
base.OnModelCreating(modelBuilder);
}
catch (Exception ex)
{
string mapPath = ($"Log/").MapPath();
Utilities.FileHelper.WriteFile(mapPath, $"syslog_{DateTime.Now.ToString("yyyyMMddHHmmss")}.txt", ex.Message + ex.StackTrace + ex.Source);
}
}
}
}