EF: refactoring
This commit is contained in:
parent
bb5c2a23e7
commit
aa62721e73
@ -9,20 +9,39 @@ using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace ASC.Core.Common.EF
|
||||
{
|
||||
public enum Provider
|
||||
{
|
||||
Postrge,
|
||||
MySql
|
||||
}
|
||||
|
||||
public class BaseDbContext : DbContext
|
||||
{
|
||||
public BaseDbContext() { }
|
||||
public BaseDbContext(DbContextOptions options) : base(options) => Database.EnsureCreated();
|
||||
public BaseDbContext(DbContextOptions options) : base(options)
|
||||
{
|
||||
}
|
||||
|
||||
internal ILoggerFactory LoggerFactory { get; set; }
|
||||
internal ConnectionStringSettings ConnectionStringSettings { get; set; }
|
||||
internal Provider Provider { get; set; }
|
||||
|
||||
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
|
||||
{
|
||||
optionsBuilder.UseLoggerFactory(LoggerFactory);
|
||||
optionsBuilder.EnableSensitiveDataLogging();
|
||||
optionsBuilder.UseMySql(ConnectionStringSettings.ConnectionString);
|
||||
optionsBuilder.UseNpgsql(ConnectionStringSettings.ConnectionString);
|
||||
|
||||
switch (ConnectionStringSettings.ProviderName)
|
||||
{
|
||||
case "MySql.Data.MySqlClient":
|
||||
Provider = Provider.MySql;
|
||||
optionsBuilder.UseMySql(ConnectionStringSettings.ConnectionString);
|
||||
break;
|
||||
case "Npgsql":
|
||||
Provider = Provider.Postrge;
|
||||
optionsBuilder.UseNpgsql(ConnectionStringSettings.ConnectionString);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -26,7 +26,13 @@ namespace ASC.Core.Common.EF
|
||||
{
|
||||
if (!Pairs.ContainsKey(name))
|
||||
{
|
||||
Pairs.Add(name, base.Get(name));
|
||||
var t = base.Get(name);
|
||||
Pairs.Add(name, t);
|
||||
|
||||
if (t is BaseDbContext dbContext)
|
||||
{
|
||||
dbContext.Database.EnsureCreated();
|
||||
}
|
||||
}
|
||||
|
||||
return Pairs[name];
|
||||
@ -78,7 +84,6 @@ namespace ASC.Core.Common.EF
|
||||
services.TryAddScoped<MultiRegionalDbContextManager<T>>();
|
||||
services.TryAddScoped<IConfigureOptions<T>, ConfigureDbContext>();
|
||||
services.TryAddScoped<IConfigureOptions<MultiRegionalDbContext<T>>, ConfigureMultiRegionalDbContext<T>>();
|
||||
|
||||
return services.AddLoggerService();
|
||||
}
|
||||
return services;
|
||||
|
@ -1,4 +1,5 @@
|
||||
using ASC.Common;
|
||||
|
||||
using ASC.Common;
|
||||
using ASC.Core.Common.EF.Model;
|
||||
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
@ -20,20 +21,16 @@ namespace ASC.Core.Common.EF.Context
|
||||
public TenantDbContext(DbContextOptions<TenantDbContext> options)
|
||||
: base(options)
|
||||
{
|
||||
Database.EnsureCreated();
|
||||
|
||||
}
|
||||
|
||||
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
||||
{
|
||||
modelBuilder.MySqlAddUser();
|
||||
modelBuilder.MySqlAddCoreSettings();
|
||||
modelBuilder.MySqlAddDbTenant();
|
||||
modelBuilder.MySqlAddUserSecurity();
|
||||
modelBuilder.MySqlAddDbTenantForbiden();
|
||||
modelBuilder.MySqlAddTenantIpRestrictions();
|
||||
modelBuilder.MySqlAddDbTenantPartner();
|
||||
modelBuilder.MySqlAddDbTenantVersion();
|
||||
ModelBuilderWrapper
|
||||
.From(modelBuilder, Provider)
|
||||
.AddUser()
|
||||
.Finish();
|
||||
|
||||
modelBuilder.PgSqlAddUser();
|
||||
modelBuilder.PgSqlAddCoreSettings();
|
||||
modelBuilder.PgSqlAddDbTenant();
|
||||
modelBuilder.PgSqlAddUserSecurity();
|
||||
@ -44,6 +41,7 @@ namespace ASC.Core.Common.EF.Context
|
||||
|
||||
OnModelCreatingPartial(modelBuilder);
|
||||
}
|
||||
|
||||
partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
|
||||
}
|
||||
|
||||
|
@ -1,4 +1,5 @@
|
||||
using ASC.Common;
|
||||
using ASC.Core.Common.EF.Model;
|
||||
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
|
||||
@ -25,22 +26,27 @@ namespace ASC.Core.Common.EF
|
||||
|
||||
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
||||
{
|
||||
modelBuilder
|
||||
.MySqlAddAcl()
|
||||
.MySqlAddSubscription()
|
||||
.MySqlAddSubscriptionMethod()
|
||||
.MySqlAddUser();
|
||||
modelBuilder.MySqlAddDbGroup();
|
||||
modelBuilder.MySqlAddUserSecurity();
|
||||
modelBuilder.MySqlAddUserGroup();
|
||||
modelBuilder.MySqlAddUserPhoto();
|
||||
//modelBuilder
|
||||
// .MySqlAddAcl()
|
||||
// .MySqlAddSubscription()
|
||||
// .MySqlAddSubscriptionMethod()
|
||||
// .MySqlAddUser();
|
||||
//modelBuilder.MySqlAddDbGroup();
|
||||
//modelBuilder.MySqlAddUserSecurity();
|
||||
//modelBuilder.MySqlAddUserGroup();
|
||||
//modelBuilder.MySqlAddUserPhoto();
|
||||
|
||||
modelBuilder
|
||||
.PgSqlAddAcl()
|
||||
.PgSqlAddSubscription()
|
||||
.PgSqlAddSubscriptionMethod()
|
||||
.PgSqlAddUser();
|
||||
modelBuilder.PgSqlAddDbGroup();
|
||||
.PgSqlAddSubscriptionMethod();
|
||||
|
||||
ModelBuilderWrapper
|
||||
.From(modelBuilder, Provider)
|
||||
.AddUser()
|
||||
.Finish();
|
||||
|
||||
modelBuilder.AddDbGroup();
|
||||
modelBuilder.PgSqlAddUserSecurity();
|
||||
modelBuilder.PgSqlAddUserGroup();
|
||||
modelBuilder.PgSqlAddUserPhoto();
|
||||
|
49
common/ASC.Core.Common/EF/Model/ModelBuilderWrapper.cs
Normal file
49
common/ASC.Core.Common/EF/Model/ModelBuilderWrapper.cs
Normal file
@ -0,0 +1,49 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
|
||||
namespace ASC.Core.Common.EF.Model
|
||||
{
|
||||
public class ModelBuilderWrapper
|
||||
{
|
||||
ModelBuilder ModelBuilder { get; set; }
|
||||
Provider Provider { get; set; }
|
||||
Dictionary<Provider, List<Action<ModelBuilder>>> Actions { get; set; }
|
||||
|
||||
private ModelBuilderWrapper(ModelBuilder modelBuilder, Provider provider)
|
||||
{
|
||||
ModelBuilder = modelBuilder;
|
||||
Provider = provider;
|
||||
Actions = new Dictionary<Provider, List<Action<ModelBuilder>>>();
|
||||
}
|
||||
|
||||
public static ModelBuilderWrapper From(ModelBuilder modelBuilder, Provider provider)
|
||||
{
|
||||
return new ModelBuilderWrapper(modelBuilder, provider);
|
||||
}
|
||||
|
||||
public ModelBuilderWrapper Add(Action<ModelBuilder> action, Provider provider)
|
||||
{
|
||||
if (!Actions.ContainsKey(provider))
|
||||
{
|
||||
Actions.Add(provider, new List<Action<ModelBuilder>>());
|
||||
}
|
||||
|
||||
Actions[provider].Add(action);
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
public void Finish()
|
||||
{
|
||||
if (Actions.ContainsKey(Provider))
|
||||
{
|
||||
foreach (var action in Actions[Provider])
|
||||
{
|
||||
action(ModelBuilder);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,7 +1,8 @@
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using System;
|
||||
using System;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
|
||||
namespace ASC.Core.Common.EF
|
||||
{
|
||||
[Table("core_group")]
|
||||
@ -25,7 +26,15 @@ namespace ASC.Core.Common.EF
|
||||
}
|
||||
public static class DbGroupExtension
|
||||
{
|
||||
public static void MySqlAddDbGroup(this ModelBuilder modelBuilder)
|
||||
public static ModelBuilder AddDbGroup(this ModelBuilder modelBuilder)
|
||||
{
|
||||
modelBuilder.MySqlAddDbGroup();
|
||||
modelBuilder.PgSqlAddDbGroup();
|
||||
|
||||
return modelBuilder;
|
||||
}
|
||||
|
||||
private static void MySqlAddDbGroup(this ModelBuilder modelBuilder)
|
||||
{
|
||||
modelBuilder.Entity<DbGroup>(entity =>
|
||||
{
|
||||
@ -78,7 +87,7 @@ namespace ASC.Core.Common.EF
|
||||
entity.Property(e => e.Tenant).HasColumnName("tenant");
|
||||
});
|
||||
}
|
||||
public static void PgSqlAddDbGroup(this ModelBuilder modelBuilder)
|
||||
private static void PgSqlAddDbGroup(this ModelBuilder modelBuilder)
|
||||
{
|
||||
modelBuilder.Entity<DbGroup>(entity =>
|
||||
{
|
||||
|
@ -2,6 +2,7 @@
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
|
||||
using ASC.Core.Common.EF.Model;
|
||||
using ASC.Core.Users;
|
||||
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
@ -79,7 +80,15 @@ namespace ASC.Core.Common.EF
|
||||
|
||||
public static class DbUserExtension
|
||||
{
|
||||
public static void MySqlAddUser(this ModelBuilder modelBuilder)
|
||||
public static ModelBuilderWrapper AddUser(this ModelBuilderWrapper modelBuilder)
|
||||
{
|
||||
modelBuilder
|
||||
.Add(MySqlAddUser, Provider.MySql)
|
||||
.Add(PgSqlAddUser, Provider.Postrge);
|
||||
return modelBuilder;
|
||||
}
|
||||
|
||||
private static void MySqlAddUser(this ModelBuilder modelBuilder)
|
||||
{
|
||||
modelBuilder.MySqlAddUserGroup();
|
||||
modelBuilder.Entity<User>(entity =>
|
||||
@ -219,7 +228,8 @@ namespace ASC.Core.Common.EF
|
||||
.HasColumnType("datetime");
|
||||
});
|
||||
}
|
||||
public static void PgSqlAddUser(this ModelBuilder modelBuilder)
|
||||
|
||||
private static void PgSqlAddUser(this ModelBuilder modelBuilder)
|
||||
{
|
||||
modelBuilder.PgSqlAddUserGroup();
|
||||
modelBuilder.Entity<User>(entity =>
|
||||
|
@ -225,7 +225,7 @@ namespace ASC.Core
|
||||
{
|
||||
var dbContextOptionsBuilder = new DbContextOptionsBuilder<DbContext>();
|
||||
var options = dbContextOptionsBuilder
|
||||
.UseMySql(cs.ConnectionString)
|
||||
//.UseMySql(cs.ConnectionString)
|
||||
.UseNpgsql(cs.ConnectionString)
|
||||
.UseLoggerFactory(LoggerFactory)
|
||||
.Options;
|
||||
@ -255,7 +255,7 @@ namespace ASC.Core
|
||||
{
|
||||
var dbContextOptionsBuilder = new DbContextOptionsBuilder<DbContext>();
|
||||
var options = dbContextOptionsBuilder
|
||||
.UseMySql(connectionString.ConnectionString)
|
||||
//.UseMySql(connectionString.ConnectionString)
|
||||
.UseNpgsql(connectionString.ConnectionString)
|
||||
.UseLoggerFactory(LoggerFactory)
|
||||
.Options;
|
||||
|
@ -101,15 +101,20 @@
|
||||
"ConnectionStrings": {
|
||||
"default": {
|
||||
"name": "default",
|
||||
"connectionString": "Host=localhost;Port=5432;Database=onlyoffice;Username=postgres;Password=dev;",
|
||||
"providerName": "Npgsql"
|
||||
},
|
||||
"postgre":{
|
||||
"name": "postgre",
|
||||
"connectionString": "Host=localhost;Port=5432;Database=onlyoffice;Username=postgres;Password=dev;",
|
||||
"providerName": "Npgsql"
|
||||
},
|
||||
"mysql":
|
||||
{
|
||||
"name": "mysql",
|
||||
"connectionString": "Server=localhost;Database=onlyoffice;User ID=dev;Password=dev;Pooling=true;Character Set=utf8;AutoEnlist=false;SSL Mode=none;AllowPublicKeyRetrieval=True",
|
||||
"providerName": "MySql.Data.MySqlClient"
|
||||
}
|
||||
},
|
||||
"ConnectionStrings_PgSql": {
|
||||
"default": {
|
||||
"name": "default",
|
||||
"connectionString": "Host=localhost;Port=5433;Database=onlyoffice;Username=postgres;Password=postgres;Pooling=true;Character Set=utf8;"
|
||||
}
|
||||
}
|
||||
},
|
||||
"DbProviderFactories": {
|
||||
"mysql": {
|
||||
|
@ -165,7 +165,7 @@ namespace ASC.Web.Core.Mail
|
||||
|
||||
var dbContextOptionsBuilder = new DbContextOptionsBuilder<MailDbContext>();
|
||||
var options = dbContextOptionsBuilder
|
||||
.UseMySql(connectionString)
|
||||
//.UseMySql(connectionString)
|
||||
.UseNpgsql(connectionString)
|
||||
.UseLoggerFactory(LoggerFactory)
|
||||
.Options;
|
||||
@ -185,7 +185,7 @@ namespace ASC.Web.Core.Mail
|
||||
|
||||
var dbContextOptionsBuilder = new DbContextOptionsBuilder<MailDbContext>();
|
||||
var options = dbContextOptionsBuilder
|
||||
.UseMySql(connectionString)
|
||||
//.UseMySql(connectionString)
|
||||
.UseNpgsql(connectionString)
|
||||
.UseLoggerFactory(LoggerFactory)
|
||||
.Options;
|
||||
|
Loading…
Reference in New Issue
Block a user