mirror of https://github.com/abpframework/abp.git
17 changed files with 260 additions and 47 deletions
@ -0,0 +1,32 @@ |
|||||
|
<Project Sdk="Microsoft.NET.Sdk"> |
||||
|
|
||||
|
<Import Project="..\..\common.props" /> |
||||
|
|
||||
|
<PropertyGroup> |
||||
|
<OutputType>Exe</OutputType> |
||||
|
<TargetFramework>netcoreapp2.2</TargetFramework> |
||||
|
</PropertyGroup> |
||||
|
|
||||
|
<ItemGroup> |
||||
|
<None Remove="appsettings.json" /> |
||||
|
</ItemGroup> |
||||
|
|
||||
|
<ItemGroup> |
||||
|
<Content Include="appsettings.json"> |
||||
|
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory> |
||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory> |
||||
|
</Content> |
||||
|
</ItemGroup> |
||||
|
|
||||
|
<ItemGroup> |
||||
|
<PackageReference Include="Serilog.Extensions.Logging" Version="2.0.4" /> |
||||
|
<PackageReference Include="Serilog.Sinks.File" Version="4.0.0" /> |
||||
|
<PackageReference Include="Serilog.Sinks.Console" Version="3.1.1" /> |
||||
|
</ItemGroup> |
||||
|
|
||||
|
<ItemGroup> |
||||
|
<ProjectReference Include="..\..\..\..\framework\src\Volo.Abp.Autofac\Volo.Abp.Autofac.csproj" /> |
||||
|
<ProjectReference Include="..\MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations\MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations.csproj" /> |
||||
|
</ItemGroup> |
||||
|
|
||||
|
</Project> |
||||
@ -0,0 +1,15 @@ |
|||||
|
using MyCompanyName.MyProjectName.EntityFrameworkCore; |
||||
|
using Volo.Abp.Autofac; |
||||
|
using Volo.Abp.Modularity; |
||||
|
|
||||
|
namespace MyCompanyName.MyProjectName.DbMigrator |
||||
|
{ |
||||
|
[DependsOn( |
||||
|
typeof(AbpAutofacModule), |
||||
|
typeof(MyProjectNameEntityFrameworkCoreDbMigrationsModule) |
||||
|
)] |
||||
|
public class MyProjectNameDbMigratorModule : AbpModule |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,53 @@ |
|||||
|
using System.IO; |
||||
|
using Microsoft.Extensions.DependencyInjection; |
||||
|
using MyCompanyName.MyProjectName.Data; |
||||
|
using Serilog; |
||||
|
using Serilog.Events; |
||||
|
using Volo.Abp; |
||||
|
using Volo.Abp.Threading; |
||||
|
|
||||
|
namespace MyCompanyName.MyProjectName.DbMigrator |
||||
|
{ |
||||
|
class Program |
||||
|
{ |
||||
|
static void Main(string[] args) |
||||
|
{ |
||||
|
ConfigureLogging(); |
||||
|
|
||||
|
using (var application = AbpApplicationFactory.Create<MyProjectNameDbMigratorModule>(options => |
||||
|
{ |
||||
|
options.UseAutofac(); |
||||
|
options.Services.AddLogging(c => c.AddSerilog()); |
||||
|
})) |
||||
|
{ |
||||
|
application.Initialize(); |
||||
|
|
||||
|
AsyncHelper.RunSync( |
||||
|
() => application |
||||
|
.ServiceProvider |
||||
|
.GetRequiredService<MyProjectNameDbMigrationService>() |
||||
|
.MigrateAsync() |
||||
|
); |
||||
|
|
||||
|
application.Shutdown(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
private static void ConfigureLogging() |
||||
|
{ |
||||
|
Log.Logger = new LoggerConfiguration() |
||||
|
.MinimumLevel.Information() |
||||
|
.MinimumLevel.Override("Microsoft", LogEventLevel.Warning) |
||||
|
.MinimumLevel.Override("Volo.Abp", LogEventLevel.Warning) |
||||
|
#if DEBUG
|
||||
|
.MinimumLevel.Override("MyCompanyName.MyProjectName", LogEventLevel.Debug) |
||||
|
#else
|
||||
|
.MinimumLevel.Override("MyCompanyName.MyProjectName", LogEventLevel.Information) |
||||
|
#endif
|
||||
|
.Enrich.FromLogContext() |
||||
|
.WriteTo.File(Path.Combine(Directory.GetCurrentDirectory(), "Logs/logs.txt")) |
||||
|
.WriteTo.Console() |
||||
|
.CreateLogger(); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,5 @@ |
|||||
|
{ |
||||
|
"ConnectionStrings": { |
||||
|
"Default": "Server=localhost;Database=MyProjectName;Trusted_Connection=True;MultipleActiveResultSets=true" |
||||
|
} |
||||
|
} |
||||
@ -1,23 +0,0 @@ |
|||||
using Microsoft.Extensions.DependencyInjection; |
|
||||
using Volo.Abp; |
|
||||
using Volo.Abp.Data; |
|
||||
using Volo.Abp.Threading; |
|
||||
|
|
||||
namespace MyCompanyName.MyProjectName.Data |
|
||||
{ |
|
||||
public static class DataSeedHelper |
|
||||
{ |
|
||||
public static void Seed(ApplicationInitializationContext context) |
|
||||
{ |
|
||||
AsyncHelper.RunSync(async () => |
|
||||
{ |
|
||||
using (var scope = context.ServiceProvider.CreateScope()) |
|
||||
{ |
|
||||
await scope.ServiceProvider |
|
||||
.GetRequiredService<IDataSeeder>() |
|
||||
.SeedAsync(); |
|
||||
} |
|
||||
}); |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
@ -0,0 +1,9 @@ |
|||||
|
using System.Threading.Tasks; |
||||
|
|
||||
|
namespace MyCompanyName.MyProjectName.Data |
||||
|
{ |
||||
|
public interface IMyProjectNameDbSchemaMigrator |
||||
|
{ |
||||
|
Task MigrateAsync(); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,39 @@ |
|||||
|
using System.Threading.Tasks; |
||||
|
using Microsoft.Extensions.Logging; |
||||
|
using Microsoft.Extensions.Logging.Abstractions; |
||||
|
using Volo.Abp.Data; |
||||
|
using Volo.Abp.DependencyInjection; |
||||
|
|
||||
|
namespace MyCompanyName.MyProjectName.Data |
||||
|
{ |
||||
|
public class MyProjectNameDbMigrationService : ITransientDependency |
||||
|
{ |
||||
|
public ILogger<MyProjectNameDbMigrationService> Logger { get; set; } |
||||
|
|
||||
|
private readonly IDataSeeder _dataSeeder; |
||||
|
private readonly IMyProjectNameDbSchemaMigrator _dbSchemaMigrator; |
||||
|
|
||||
|
public MyProjectNameDbMigrationService( |
||||
|
IDataSeeder dataSeeder, |
||||
|
IMyProjectNameDbSchemaMigrator dbSchemaMigrator) |
||||
|
{ |
||||
|
_dataSeeder = dataSeeder; |
||||
|
_dbSchemaMigrator = dbSchemaMigrator; |
||||
|
|
||||
|
Logger = NullLogger<MyProjectNameDbMigrationService>.Instance; |
||||
|
} |
||||
|
|
||||
|
public async Task MigrateAsync() |
||||
|
{ |
||||
|
Logger.LogInformation("Started database migrations..."); |
||||
|
|
||||
|
Logger.LogInformation("Migrating database schema..."); |
||||
|
await _dbSchemaMigrator.MigrateAsync(); |
||||
|
|
||||
|
Logger.LogInformation("Executing database seed..."); |
||||
|
await _dataSeeder.SeedAsync(); |
||||
|
|
||||
|
Logger.LogInformation("Successfully completed database migrations."); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,16 @@ |
|||||
|
using System.Threading.Tasks; |
||||
|
using Volo.Abp.DependencyInjection; |
||||
|
|
||||
|
namespace MyCompanyName.MyProjectName.Data |
||||
|
{ |
||||
|
/* This is used if database provider does't define |
||||
|
* IMyProjectNameDbSchemaMigrator implementation. |
||||
|
*/ |
||||
|
public class NullMyProjectNameDbSchemaMigrator : IMyProjectNameDbSchemaMigrator, ITransientDependency |
||||
|
{ |
||||
|
public Task MigrateAsync() |
||||
|
{ |
||||
|
return Task.CompletedTask; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,24 @@ |
|||||
|
using System.Threading.Tasks; |
||||
|
using Microsoft.EntityFrameworkCore; |
||||
|
using MyCompanyName.MyProjectName.Data; |
||||
|
using Volo.Abp.DependencyInjection; |
||||
|
|
||||
|
namespace MyCompanyName.MyProjectName.EntityFrameworkCore |
||||
|
{ |
||||
|
[Dependency(ReplaceServices = true)] |
||||
|
public class EntityFrameworkCoreMyProjectNameDbSchemaMigrator |
||||
|
: IMyProjectNameDbSchemaMigrator, ITransientDependency |
||||
|
{ |
||||
|
private readonly MyProjectNameMigrationsDbContext _dbContext; |
||||
|
|
||||
|
public EntityFrameworkCoreMyProjectNameDbSchemaMigrator(MyProjectNameMigrationsDbContext dbContext) |
||||
|
{ |
||||
|
_dbContext = dbContext; |
||||
|
} |
||||
|
|
||||
|
public async Task MigrateAsync() |
||||
|
{ |
||||
|
await _dbContext.Database.MigrateAsync(); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,16 @@ |
|||||
|
using Microsoft.Extensions.DependencyInjection; |
||||
|
using Volo.Abp.Modularity; |
||||
|
|
||||
|
namespace MyCompanyName.MyProjectName.EntityFrameworkCore |
||||
|
{ |
||||
|
[DependsOn( |
||||
|
typeof(MyProjectNameEntityFrameworkCoreModule) |
||||
|
)] |
||||
|
public class MyProjectNameEntityFrameworkCoreDbMigrationsModule : AbpModule |
||||
|
{ |
||||
|
public override void ConfigureServices(ServiceConfigurationContext context) |
||||
|
{ |
||||
|
context.Services.AddAbpDbContext<MyProjectNameMigrationsDbContext>(); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue