EF: refactoring

This commit is contained in:
pavelbannov 2020-09-02 18:23:39 +03:00
parent bb5c2a23e7
commit aa62721e73
10 changed files with 146 additions and 45 deletions

View File

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

View File

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

View File

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

View File

@ -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();

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

View File

@ -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 =>
{

View File

@ -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 =>

View File

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

View File

@ -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": {

View File

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