Browse Source

Added EF Core module for multitenancy

pull/189/head
Halil İbrahim Kalkan 9 years ago
parent
commit
43002e6324
  1. 7
      Volo.Abp.sln
  2. 8
      src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/AbpIdentityDomainSharedModule.cs
  3. 1
      src/Volo.Abp.Identity.EntityFrameworkCore/Volo.Abp.Identity.EntityFrameworkCore.csproj
  4. 10
      src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IdentityDbContext.cs
  5. 20
      src/Volo.Abp.MultiTenancy.Domain.Shared/Volo.Abp.MultiTenancy.Domain.Shared.csproj
  6. 13
      src/Volo.Abp.MultiTenancy.Domain.Shared/Volo/Abp/MultiTenancy/AbpMultiTenancyDomainSharedModule.cs
  7. 9
      src/Volo.Abp.MultiTenancy.Domain.Shared/Volo/Abp/MultiTenancy/TenantConnectionStringConsts.cs
  8. 7
      src/Volo.Abp.MultiTenancy.Domain.Shared/Volo/Abp/MultiTenancy/TenantConsts.cs
  9. 1
      src/Volo.Abp.MultiTenancy.Domain/Volo.Abp.MultiTenancy.Domain.csproj
  10. 3
      src/Volo.Abp.MultiTenancy.Domain/Volo/Abp/MultiTenancy/AbpMultiTenancyDomainModule.cs
  11. 5
      src/Volo.Abp.MultiTenancy.EntityFrameworkCore/Volo.Abp.MultiTenancy.EntityFrameworkCore.csproj
  12. 16
      src/Volo.Abp.MultiTenancy.EntityFrameworkCore/Volo/Abp/MultiTenancy/EntityFrameworkCore/AbpMultiTenancyEntityFrameworkCoreModule.cs
  13. 17
      src/Volo.Abp.MultiTenancy.EntityFrameworkCore/Volo/Abp/MultiTenancy/EntityFrameworkCore/IdentityDbContextFactory.cs
  14. 45
      src/Volo.Abp.MultiTenancy.EntityFrameworkCore/Volo/Abp/MultiTenancy/EntityFrameworkCore/MultiTenancyDbContext.cs

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

8
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<AbpIdentityDomainSharedModule>();
}
}
}

1
src/Volo.Abp.Identity.EntityFrameworkCore/Volo.Abp.Identity.EntityFrameworkCore.csproj

@ -19,7 +19,6 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="2.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.0.0" />
</ItemGroup>

10
src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IdentityDbContext.cs

@ -67,7 +67,7 @@ namespace Volo.Abp.Identity.EntityFrameworkCore
builder.Entity<IdentityUser>(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<IdentityRole>().WithMany().HasForeignKey(ur => ur.RoleId).IsRequired();
b.HasOne<IdentityUser>().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<IdentityUserLogin>(b =>

20
src/Volo.Abp.MultiTenancy.Domain.Shared/Volo.Abp.MultiTenancy.Domain.Shared.csproj

@ -0,0 +1,20 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\common.props" />
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<AssemblyName>Volo.Abp.MultiTenancy.Domain.Shared</AssemblyName>
<PackageId>Volo.Abp.MultiTenancy.Domain.Shared</PackageId>
<AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback>
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Volo.Abp.Core\Volo.Abp.Core.csproj" />
</ItemGroup>
</Project>

13
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<AbpMultiTenancyDomainSharedModule>();
}
}
}

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

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

1
src/Volo.Abp.MultiTenancy.Domain/Volo.Abp.MultiTenancy.Domain.csproj

@ -17,6 +17,7 @@
<ProjectReference Include="..\Volo.Abp.Data\Volo.Abp.Data.csproj" />
<ProjectReference Include="..\Volo.Abp.Ddd\Volo.Abp.Ddd.csproj" />
<ProjectReference Include="..\Volo.Abp.MultiTenancy.Abstractions\Volo.Abp.MultiTenancy.Abstractions.csproj" />
<ProjectReference Include="..\Volo.Abp.MultiTenancy.Domain.Shared\Volo.Abp.MultiTenancy.Domain.Shared.csproj" />
</ItemGroup>
</Project>

3
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
{

5
src/Volo.Abp.MultiTenancy.EntityFrameworkCore/Volo.Abp.MultiTenancy.EntityFrameworkCore.csproj

@ -14,7 +14,12 @@
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Volo.Abp.EntityFrameworkCore\Volo.Abp.EntityFrameworkCore.csproj" />
<ProjectReference Include="..\Volo.Abp.MultiTenancy.Domain\Volo.Abp.MultiTenancy.Domain.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.0.0" />
</ItemGroup>
</Project>

16
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<AbpMultiTenancyEntityFrameworkCoreModule>();
}
}
}

17
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<MultiTenancyDbContext>
{
public MultiTenancyDbContext CreateDbContext(string[] args)
{
var builder = new DbContextOptionsBuilder<MultiTenancyDbContext>();
builder.UseSqlServer("Server=localhost;Database=AbpDesk;Trusted_Connection=True;");
return new MultiTenancyDbContext(builder.Options);
}
}
}

45
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<MultiTenancyDbContext>
{
public DbSet<Tenant> Tenants { get; set; }
public DbSet<TenantConnectionString> TenantConnectionStrings { get; set; }
public MultiTenancyDbContext(DbContextOptions<MultiTenancyDbContext> 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<Tenant>(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<TenantConnectionString>(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);
});
}
}
}
Loading…
Cancel
Save