diff --git a/Volo.Abp.sln b/Volo.Abp.sln index 410a6bec56..e044bc5970 100644 --- a/Volo.Abp.sln +++ b/Volo.Abp.sln @@ -232,6 +232,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.MultiTenancy.Entit EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.MultiTenancy.Domain", "src\Volo.Abp.MultiTenancy.Domain\Volo.Abp.MultiTenancy.Domain.csproj", "{3FA1F4A4-BF5A-4CE3-B76F-2147FE31AB43}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.MultiTenancy.Domain.Shared", "src\Volo.Abp.MultiTenancy.Domain.Shared\Volo.Abp.MultiTenancy.Domain.Shared.csproj", "{4605A64C-B4E0-4A04-9BF2-501027375258}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -602,6 +604,10 @@ Global {3FA1F4A4-BF5A-4CE3-B76F-2147FE31AB43}.Debug|Any CPU.Build.0 = Debug|Any CPU {3FA1F4A4-BF5A-4CE3-B76F-2147FE31AB43}.Release|Any CPU.ActiveCfg = Release|Any CPU {3FA1F4A4-BF5A-4CE3-B76F-2147FE31AB43}.Release|Any CPU.Build.0 = Release|Any CPU + {4605A64C-B4E0-4A04-9BF2-501027375258}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4605A64C-B4E0-4A04-9BF2-501027375258}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4605A64C-B4E0-4A04-9BF2-501027375258}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4605A64C-B4E0-4A04-9BF2-501027375258}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -714,6 +720,7 @@ Global {CA154803-3589-47B3-B7CB-B18F94FE1EB6} = {3B481ACC-5BB3-4189-880C-5F7A27EAEB70} {9D7C2C19-1EE4-40BB-A1A4-27B175F1BFDD} = {CA154803-3589-47B3-B7CB-B18F94FE1EB6} {3FA1F4A4-BF5A-4CE3-B76F-2147FE31AB43} = {CA154803-3589-47B3-B7CB-B18F94FE1EB6} + {4605A64C-B4E0-4A04-9BF2-501027375258} = {CA154803-3589-47B3-B7CB-B18F94FE1EB6} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {BB97ECF4-9A84-433F-A80B-2A3285BDD1D5} diff --git a/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/AbpIdentityDomainSharedModule.cs b/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/AbpIdentityDomainSharedModule.cs index ffb7b7cb80..bd4a869b20 100644 --- a/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/AbpIdentityDomainSharedModule.cs +++ b/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/AbpIdentityDomainSharedModule.cs @@ -1,9 +1,13 @@ -using Volo.Abp.Modularity; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.Modularity; namespace Volo.Abp.Identity { public class AbpIdentityDomainSharedModule : AbpModule { - + public override void ConfigureServices(IServiceCollection services) + { + services.AddAssemblyOf(); + } } } diff --git a/src/Volo.Abp.Identity.EntityFrameworkCore/Volo.Abp.Identity.EntityFrameworkCore.csproj b/src/Volo.Abp.Identity.EntityFrameworkCore/Volo.Abp.Identity.EntityFrameworkCore.csproj index 8ff87b10b2..45fc097d37 100644 --- a/src/Volo.Abp.Identity.EntityFrameworkCore/Volo.Abp.Identity.EntityFrameworkCore.csproj +++ b/src/Volo.Abp.Identity.EntityFrameworkCore/Volo.Abp.Identity.EntityFrameworkCore.csproj @@ -19,7 +19,6 @@ - diff --git a/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IdentityDbContext.cs b/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IdentityDbContext.cs index b4f1bd649b..72a714542c 100644 --- a/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IdentityDbContext.cs +++ b/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IdentityDbContext.cs @@ -67,7 +67,7 @@ namespace Volo.Abp.Identity.EntityFrameworkCore builder.Entity(b => { - b.ToTable("IdentityUsers"); + b.ToTable("IdentityUsers"); //TODO: Make all table and schema names changeable b.Property(u => u.UserName).IsRequired().HasMaxLength(IdentityUserConsts.MaxUserNameLength); b.Property(u => u.NormalizedUserName).IsRequired().HasMaxLength(IdentityUserConsts.MaxNormalizedUserNameLength); @@ -96,8 +96,8 @@ namespace Volo.Abp.Identity.EntityFrameworkCore { b.ToTable("IdentityRoles"); - b.Property(u => u.Name).IsRequired().HasMaxLength(IdentityRoleConsts.MaxNameLength); - b.Property(u => u.NormalizedName).IsRequired().HasMaxLength(IdentityRoleConsts.MaxNormalizedNameLength); + b.Property(r => r.Name).IsRequired().HasMaxLength(IdentityRoleConsts.MaxNameLength); + b.Property(r => r.NormalizedName).IsRequired().HasMaxLength(IdentityRoleConsts.MaxNormalizedNameLength); b.HasMany(r => r.Claims).WithOne().HasForeignKey(rc => rc.RoleId).IsRequired(); @@ -131,8 +131,8 @@ namespace Volo.Abp.Identity.EntityFrameworkCore b.HasOne().WithMany().HasForeignKey(ur => ur.RoleId).IsRequired(); b.HasOne().WithMany(u => u.Roles).HasForeignKey(ur => ur.UserId).IsRequired(); - b.HasIndex(r => new { r.UserId, r.RoleId }); - b.HasIndex(r => new { r.RoleId, r.UserId }); + b.HasIndex(ur => new { ur.UserId, ur.RoleId }); + b.HasIndex(ur => new { ur.RoleId, ur.UserId }); }); builder.Entity(b => diff --git a/src/Volo.Abp.MultiTenancy.Domain.Shared/Volo.Abp.MultiTenancy.Domain.Shared.csproj b/src/Volo.Abp.MultiTenancy.Domain.Shared/Volo.Abp.MultiTenancy.Domain.Shared.csproj new file mode 100644 index 0000000000..b70a0623dd --- /dev/null +++ b/src/Volo.Abp.MultiTenancy.Domain.Shared/Volo.Abp.MultiTenancy.Domain.Shared.csproj @@ -0,0 +1,20 @@ + + + + + + netstandard2.0 + Volo.Abp.MultiTenancy.Domain.Shared + Volo.Abp.MultiTenancy.Domain.Shared + $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; + false + false + false + + + + + + + + diff --git a/src/Volo.Abp.MultiTenancy.Domain.Shared/Volo/Abp/MultiTenancy/AbpMultiTenancyDomainSharedModule.cs b/src/Volo.Abp.MultiTenancy.Domain.Shared/Volo/Abp/MultiTenancy/AbpMultiTenancyDomainSharedModule.cs new file mode 100644 index 0000000000..5417f21b69 --- /dev/null +++ b/src/Volo.Abp.MultiTenancy.Domain.Shared/Volo/Abp/MultiTenancy/AbpMultiTenancyDomainSharedModule.cs @@ -0,0 +1,13 @@ +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.Modularity; + +namespace Volo.Abp.MultiTenancy +{ + public class AbpMultiTenancyDomainSharedModule : AbpModule + { + public override void ConfigureServices(IServiceCollection services) + { + services.AddAssemblyOf(); + } + } +} diff --git a/src/Volo.Abp.MultiTenancy.Domain.Shared/Volo/Abp/MultiTenancy/TenantConnectionStringConsts.cs b/src/Volo.Abp.MultiTenancy.Domain.Shared/Volo/Abp/MultiTenancy/TenantConnectionStringConsts.cs new file mode 100644 index 0000000000..067b87a2d2 --- /dev/null +++ b/src/Volo.Abp.MultiTenancy.Domain.Shared/Volo/Abp/MultiTenancy/TenantConnectionStringConsts.cs @@ -0,0 +1,9 @@ +namespace Volo.Abp.MultiTenancy +{ + public static class TenantConnectionStringConsts + { + public const int MaxNameLength = 256; + + public const int MaxValueLength = 1024; + } +} \ No newline at end of file diff --git a/src/Volo.Abp.MultiTenancy.Domain.Shared/Volo/Abp/MultiTenancy/TenantConsts.cs b/src/Volo.Abp.MultiTenancy.Domain.Shared/Volo/Abp/MultiTenancy/TenantConsts.cs new file mode 100644 index 0000000000..cfffa5cc25 --- /dev/null +++ b/src/Volo.Abp.MultiTenancy.Domain.Shared/Volo/Abp/MultiTenancy/TenantConsts.cs @@ -0,0 +1,7 @@ +namespace Volo.Abp.MultiTenancy +{ + public static class TenantConsts + { + public const int MaxNameLength = 64; + } +} diff --git a/src/Volo.Abp.MultiTenancy.Domain/Volo.Abp.MultiTenancy.Domain.csproj b/src/Volo.Abp.MultiTenancy.Domain/Volo.Abp.MultiTenancy.Domain.csproj index d1979fd5cf..b969b03419 100644 --- a/src/Volo.Abp.MultiTenancy.Domain/Volo.Abp.MultiTenancy.Domain.csproj +++ b/src/Volo.Abp.MultiTenancy.Domain/Volo.Abp.MultiTenancy.Domain.csproj @@ -17,6 +17,7 @@ + diff --git a/src/Volo.Abp.MultiTenancy.Domain/Volo/Abp/MultiTenancy/AbpMultiTenancyDomainModule.cs b/src/Volo.Abp.MultiTenancy.Domain/Volo/Abp/MultiTenancy/AbpMultiTenancyDomainModule.cs index 064e4b82ab..dcb2c5eeb4 100644 --- a/src/Volo.Abp.MultiTenancy.Domain/Volo/Abp/MultiTenancy/AbpMultiTenancyDomainModule.cs +++ b/src/Volo.Abp.MultiTenancy.Domain/Volo/Abp/MultiTenancy/AbpMultiTenancyDomainModule.cs @@ -4,8 +4,9 @@ using Volo.Abp.Modularity; namespace Volo.Abp.MultiTenancy { - [DependsOn(typeof(AbpDataModule))] [DependsOn(typeof(AbpMultiTenancyAbstractionsModule))] + [DependsOn(typeof(AbpMultiTenancyDomainSharedModule))] + [DependsOn(typeof(AbpDataModule))] [DependsOn(typeof(AbpDddModule))] public class AbpMultiTenancyDomainModule : AbpModule { diff --git a/src/Volo.Abp.MultiTenancy.EntityFrameworkCore/Volo.Abp.MultiTenancy.EntityFrameworkCore.csproj b/src/Volo.Abp.MultiTenancy.EntityFrameworkCore/Volo.Abp.MultiTenancy.EntityFrameworkCore.csproj index 9fca1e96ac..1fda5bf8d0 100644 --- a/src/Volo.Abp.MultiTenancy.EntityFrameworkCore/Volo.Abp.MultiTenancy.EntityFrameworkCore.csproj +++ b/src/Volo.Abp.MultiTenancy.EntityFrameworkCore/Volo.Abp.MultiTenancy.EntityFrameworkCore.csproj @@ -14,7 +14,12 @@ + + + + + diff --git a/src/Volo.Abp.MultiTenancy.EntityFrameworkCore/Volo/Abp/MultiTenancy/EntityFrameworkCore/AbpMultiTenancyEntityFrameworkCoreModule.cs b/src/Volo.Abp.MultiTenancy.EntityFrameworkCore/Volo/Abp/MultiTenancy/EntityFrameworkCore/AbpMultiTenancyEntityFrameworkCoreModule.cs new file mode 100644 index 0000000000..b8676711d8 --- /dev/null +++ b/src/Volo.Abp.MultiTenancy.EntityFrameworkCore/Volo/Abp/MultiTenancy/EntityFrameworkCore/AbpMultiTenancyEntityFrameworkCoreModule.cs @@ -0,0 +1,16 @@ +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.EntityFrameworkCore; +using Volo.Abp.Modularity; + +namespace Volo.Abp.MultiTenancy.EntityFrameworkCore +{ + [DependsOn(typeof(AbpMultiTenancyDomainModule))] + [DependsOn(typeof(AbpEntityFrameworkCoreModule))] + public class AbpMultiTenancyEntityFrameworkCoreModule : AbpModule + { + public override void ConfigureServices(IServiceCollection services) + { + services.AddAssemblyOf(); + } + } +} diff --git a/src/Volo.Abp.MultiTenancy.EntityFrameworkCore/Volo/Abp/MultiTenancy/EntityFrameworkCore/IdentityDbContextFactory.cs b/src/Volo.Abp.MultiTenancy.EntityFrameworkCore/Volo/Abp/MultiTenancy/EntityFrameworkCore/IdentityDbContextFactory.cs new file mode 100644 index 0000000000..49eeeba973 --- /dev/null +++ b/src/Volo.Abp.MultiTenancy.EntityFrameworkCore/Volo/Abp/MultiTenancy/EntityFrameworkCore/IdentityDbContextFactory.cs @@ -0,0 +1,17 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Design; + +namespace Volo.Abp.MultiTenancy.EntityFrameworkCore +{ + /* This class is needed for EF Core command line tooling */ + + public class MultiTenancyDbContextFactory : IDesignTimeDbContextFactory + { + public MultiTenancyDbContext CreateDbContext(string[] args) + { + var builder = new DbContextOptionsBuilder(); + builder.UseSqlServer("Server=localhost;Database=AbpDesk;Trusted_Connection=True;"); + return new MultiTenancyDbContext(builder.Options); + } + } +} diff --git a/src/Volo.Abp.MultiTenancy.EntityFrameworkCore/Volo/Abp/MultiTenancy/EntityFrameworkCore/MultiTenancyDbContext.cs b/src/Volo.Abp.MultiTenancy.EntityFrameworkCore/Volo/Abp/MultiTenancy/EntityFrameworkCore/MultiTenancyDbContext.cs new file mode 100644 index 0000000000..0dc023ad9f --- /dev/null +++ b/src/Volo.Abp.MultiTenancy.EntityFrameworkCore/Volo/Abp/MultiTenancy/EntityFrameworkCore/MultiTenancyDbContext.cs @@ -0,0 +1,45 @@ +using Microsoft.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; + +namespace Volo.Abp.MultiTenancy.EntityFrameworkCore +{ + public class MultiTenancyDbContext : AbpDbContext + { + public DbSet Tenants { get; set; } + + public DbSet TenantConnectionStrings { get; set; } + + public MultiTenancyDbContext(DbContextOptions options) + : base(options) + { + } + + protected override void OnModelCreating(ModelBuilder builder) + { + base.OnModelCreating(builder); + + //TODO: Split configuration to dedicated classes (probably a resuable extension method) + + builder.Entity(b => + { + b.ToTable("MtTenants"); //TODO: Make all table and schema names changeable + + b.Property(t => t.Name).IsRequired().HasMaxLength(TenantConsts.MaxNameLength); + + b.HasMany(u => u.ConnectionStrings).WithOne().HasForeignKey(uc => uc.TenantId).IsRequired(); + + b.HasIndex(u => u.Name); + }); + + builder.Entity(b => + { + b.ToTable("MtTenantConnectionStrings"); + + b.Property(cs => cs.Name).IsRequired().HasMaxLength(TenantConnectionStringConsts.MaxNameLength); + b.Property(cs => cs.Value).IsRequired().HasMaxLength(TenantConnectionStringConsts.MaxValueLength); + + b.HasIndex(cs => cs.TenantId); + }); + } + } +}