Skip to content

Commit 4941168

Browse files
committedSep 1, 2016
Worked on EF Core Migrator.
1 parent 897ee89 commit 4941168

20 files changed

+2835
-20
lines changed
 

‎Abp.Zero.sln

+7
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Abp.Zero.SampleApp.EntityFr
3434
EndProject
3535
Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Abp.Zero.SampleApp.EntityFrameworkCore.Tests", "test\Abp.Zero.SampleApp.EntityFrameworkCore.Tests\Abp.Zero.SampleApp.EntityFrameworkCore.Tests.xproj", "{9223F076-ECE7-4381-9BBF-F3E33073B91A}"
3636
EndProject
37+
Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Abp.Zero.SampleApp.EntityFrameworkCore.ConsoleAppTest", "test\Abp.Zero.SampleApp.EntityFrameworkCore.ConsoleAppTest\Abp.Zero.SampleApp.EntityFrameworkCore.ConsoleAppTest.xproj", "{25F73233-3922-4BC0-AC1C-2042613DEC5E}"
38+
EndProject
3739
Global
3840
GlobalSection(SolutionConfigurationPlatforms) = preSolution
3941
Debug|Any CPU = Debug|Any CPU
@@ -84,6 +86,10 @@ Global
8486
{9223F076-ECE7-4381-9BBF-F3E33073B91A}.Debug|Any CPU.Build.0 = Debug|Any CPU
8587
{9223F076-ECE7-4381-9BBF-F3E33073B91A}.Release|Any CPU.ActiveCfg = Release|Any CPU
8688
{9223F076-ECE7-4381-9BBF-F3E33073B91A}.Release|Any CPU.Build.0 = Release|Any CPU
89+
{25F73233-3922-4BC0-AC1C-2042613DEC5E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
90+
{25F73233-3922-4BC0-AC1C-2042613DEC5E}.Debug|Any CPU.Build.0 = Debug|Any CPU
91+
{25F73233-3922-4BC0-AC1C-2042613DEC5E}.Release|Any CPU.ActiveCfg = Release|Any CPU
92+
{25F73233-3922-4BC0-AC1C-2042613DEC5E}.Release|Any CPU.Build.0 = Release|Any CPU
8793
EndGlobalSection
8894
GlobalSection(SolutionProperties) = preSolution
8995
HideSolutionNode = FALSE
@@ -100,5 +106,6 @@ Global
100106
{83108E5E-FD31-4762-8854-D795A8FB482F} = {364398C2-9B6A-40B3-9845-23ABFB8D12AB}
101107
{76E2CCE7-A61F-4700-9054-9923645E41CC} = {E1AD01DD-1A0D-40DF-AFBE-F2AA3B4160AB}
102108
{9223F076-ECE7-4381-9BBF-F3E33073B91A} = {E1AD01DD-1A0D-40DF-AFBE-F2AA3B4160AB}
109+
{25F73233-3922-4BC0-AC1C-2042613DEC5E} = {E1AD01DD-1A0D-40DF-AFBE-F2AA3B4160AB}
103110
EndGlobalSection
104111
EndGlobal

‎src/Abp.Zero.EntityFramework/Zero/EntityFramework/AbpZeroDbMigrator.cs

+4-1
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,13 @@ protected virtual void CreateOrMigrate(AbpTenantBase tenant)
4848
tenant == null ? (int?) null : (int?) tenant.Id,
4949
tenant == null ? MultiTenancySides.Host : MultiTenancySides.Tenant
5050
);
51+
5152
args["DbContextType"] = typeof (TDbContext);
5253
args["DbContextConcreteType"] = typeof(TDbContext);
5354

54-
var nameOrConnectionString = ConnectionStringHelper.GetConnectionString(_connectionStringResolver.GetNameOrConnectionString(args));
55+
var nameOrConnectionString = ConnectionStringHelper.GetConnectionString(
56+
_connectionStringResolver.GetNameOrConnectionString(args)
57+
);
5558

5659
using (var uow = _unitOfWorkManager.Begin(TransactionScopeOption.Suppress))
5760
{

‎src/Abp.Zero.EntityFrameworkCore/Temp/AbpOverrides.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
namespace Abp.Temp
1313
{
14-
/* TODO: Move to Abp.EntityFrameworkCore package! */
14+
/* TODO: Remove this code after ABP upgrade! */
1515

1616
public class DefaultDbContextResolver : IDbContextResolver, ITransientDependency
1717
{

‎src/Abp.Zero.EntityFrameworkCore/Zero/EntityFrameworkCore/AbpZeroCommonDbContext.cs

-2
Original file line numberDiff line numberDiff line change
@@ -135,8 +135,6 @@ protected override void OnModelCreating(ModelBuilder modelBuilder)
135135
.WithOne()
136136
.HasForeignKey<TUser>(p => p.LastModifierUserId);
137137
});
138-
139-
140138
}
141139
}
142140
}

‎src/Abp.Zero.EntityFrameworkCore/Zero/EntityFrameworkCore/AbpZeroDbContext.cs

+1
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ protected AbpZeroDbContext(DbContextOptions<TSelf> options)
6969
protected override void OnModelCreating(ModelBuilder modelBuilder)
7070
{
7171
base.OnModelCreating(modelBuilder);
72+
7273
#region BackgroundJobInfo.IX_IsAbandoned_NextTryTime
7374

7475

‎src/Abp.Zero.EntityFrameworkCore/Zero/EntityFrameworkCore/AbpZeroDbMigrator.cs

+15-10
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
using Abp.Data;
33
using Abp.Dependency;
44
using Abp.Domain.Uow;
5+
using Abp.EntityFrameworkCore;
6+
using Abp.EntityFrameworkCore.Uow;
57
using Abp.Extensions;
68
using Abp.MultiTenancy;
79
using Microsoft.EntityFrameworkCore;
@@ -14,15 +16,18 @@ public abstract class AbpZeroDbMigrator<TDbContext> : IAbpZeroDbMigrator, ITrans
1416
private readonly IUnitOfWorkManager _unitOfWorkManager;
1517
private readonly IDbPerTenantConnectionStringResolver _connectionStringResolver;
1618
private readonly IIocResolver _iocResolver;
19+
private readonly IDbContextResolver _dbContextResolver;
1720

1821
protected AbpZeroDbMigrator(
19-
IUnitOfWorkManager unitOfWorkManager,
22+
IUnitOfWorkManager unitOfWorkManager,
2023
IDbPerTenantConnectionStringResolver connectionStringResolver,
21-
IIocResolver iocResolver)
24+
IIocResolver iocResolver,
25+
IDbContextResolver dbContextResolver)
2226
{
2327
_unitOfWorkManager = unitOfWorkManager;
2428
_connectionStringResolver = connectionStringResolver;
2529
_iocResolver = iocResolver;
30+
_dbContextResolver = dbContextResolver;
2631
}
2732

2833
public virtual void CreateOrMigrateForHost()
@@ -45,20 +50,20 @@ protected virtual void CreateOrMigrate(AbpTenantBase tenant)
4550
var args = new DbPerTenantConnectionStringResolveArgs(
4651
tenant == null ? (int?) null : (int?) tenant.Id,
4752
tenant == null ? MultiTenancySides.Host : MultiTenancySides.Tenant
48-
);
49-
args["DbContextType"] = typeof (TDbContext);
53+
);
54+
55+
args["DbContextType"] = typeof(TDbContext);
5056
args["DbContextConcreteType"] = typeof(TDbContext);
5157

52-
var nameOrConnectionString = ConnectionStringHelper.GetConnectionString(_connectionStringResolver.GetNameOrConnectionString(args));
58+
var nameOrConnectionString = ConnectionStringHelper.GetConnectionString(
59+
_connectionStringResolver.GetNameOrConnectionString(args)
60+
);
5361

5462
using (var uow = _unitOfWorkManager.Begin(TransactionScopeOption.Suppress))
5563
{
56-
using (var dbContext = _iocResolver.ResolveAsDisposable<TDbContext>(new {nameOrConnectionString = nameOrConnectionString}))
64+
using (var dbContext = _dbContextResolver.Resolve<TDbContext>(nameOrConnectionString))
5765
{
58-
//TODO: Please comple the logic of migrations
59-
dbContext.Object.Database.Migrate();
60-
61-
66+
dbContext.Database.Migrate();
6267
_unitOfWorkManager.Current.SaveChanges();
6368
uow.Complete();
6469
}

‎src/Abp.Zero.EntityFrameworkCore/Zero/EntityFrameworkCore/DbPerTenantConnectionStringResolver.cs

+1-2
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,7 @@ public DbPerTenantConnectionStringResolver(
2727
IAbpStartupConfiguration configuration,
2828
ICurrentUnitOfWorkProvider currentUnitOfWorkProvider,
2929
ITenantCache tenantCache)
30-
: base(
31-
configuration)
30+
: base(configuration)
3231
{
3332
_currentUnitOfWorkProvider = currentUnitOfWorkProvider;
3433
_tenantCache = tenantCache;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3+
<PropertyGroup>
4+
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">14.0</VisualStudioVersion>
5+
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
6+
</PropertyGroup>
7+
8+
<Import Project="$(VSToolsPath)\DotNet\Microsoft.DotNet.Props" Condition="'$(VSToolsPath)' != ''" />
9+
<PropertyGroup Label="Globals">
10+
<ProjectGuid>25f73233-3922-4bc0-ac1c-2042613dec5e</ProjectGuid>
11+
<RootNamespace>Abp.Zero.SampleApp.EntityFrameworkCore.ConsoleAppTest</RootNamespace>
12+
<BaseIntermediateOutputPath Condition="'$(BaseIntermediateOutputPath)'=='' ">.\obj</BaseIntermediateOutputPath>
13+
<OutputPath Condition="'$(OutputPath)'=='' ">.\bin\</OutputPath>
14+
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
15+
</PropertyGroup>
16+
17+
<PropertyGroup>
18+
<SchemaVersion>2.0</SchemaVersion>
19+
</PropertyGroup>
20+
<Import Project="$(VSToolsPath)\DotNet\Microsoft.DotNet.targets" Condition="'$(VSToolsPath)' != ''" />
21+
</Project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
using System;
2+
using System.Reflection;
3+
using Abp.Castle.Logging.Log4Net;
4+
using Abp.Dependency;
5+
using Abp.Domain.Uow;
6+
using Abp.EntityFrameworkCore;
7+
using Abp.EntityFrameworkCore.Configuration;
8+
using Abp.Modules;
9+
using Abp.MultiTenancy;
10+
using Abp.Zero.EntityFrameworkCore;
11+
using Castle.Facilities.Logging;
12+
using Castle.LoggingFacility.MsLogging;
13+
using Castle.Windsor.MsDependencyInjection;
14+
using Microsoft.EntityFrameworkCore;
15+
using Microsoft.Extensions.DependencyInjection;
16+
using ILoggerFactory = Castle.Core.Logging.ILoggerFactory;
17+
18+
namespace Abp.Zero.SampleApp.EntityFrameworkCore.ConsoleAppTest
19+
{
20+
public class Program
21+
{
22+
public static void Main(string[] args)
23+
{
24+
using (var abpBootstrapper = AbpBootstrapper.Create<EfCoreTestConsoleAppModule>())
25+
{
26+
abpBootstrapper.IocManager.IocContainer.AddFacility<LoggingFacility>(
27+
f => f.UseAbpLog4Net().WithConfig("log4net.config")
28+
);
29+
30+
abpBootstrapper.Initialize();
31+
abpBootstrapper.IocManager.Using<MigratorRunner>(migrateTester => migrateTester.Run());
32+
}
33+
34+
Console.WriteLine("Press Enter to EXIT!");
35+
Console.ReadLine();
36+
}
37+
}
38+
39+
[DependsOn(typeof(SampleAppEntityFrameworkCoreModule))]
40+
public class EfCoreTestConsoleAppModule : AbpModule
41+
{
42+
public override void PreInitialize()
43+
{
44+
Configuration.DefaultNameOrConnectionString = "Server=localhost; Database=AbpZeroMigrateTest; Trusted_Connection=True;";
45+
46+
var services = new ServiceCollection();
47+
services.AddLogging();
48+
services.AddEntityFrameworkSqlServer();
49+
50+
var serviceProvider = WindsorRegistrationHelper.CreateServiceProvider(
51+
IocManager.IocContainer,
52+
services
53+
);
54+
55+
var castleLoggerFactory = serviceProvider.GetService<ILoggerFactory>();
56+
if (castleLoggerFactory != null)
57+
{
58+
serviceProvider
59+
.GetRequiredService<Microsoft.Extensions.Logging.ILoggerFactory>()
60+
.AddCastleLogger(castleLoggerFactory);
61+
}
62+
63+
Configuration.Modules.AbpEfCore().AddDbContext<AppDbContext>(configuration =>
64+
{
65+
configuration.DbContextOptions
66+
.UseInternalServiceProvider(serviceProvider)
67+
.UseSqlServer(configuration.ConnectionString);
68+
});
69+
}
70+
71+
public override void Initialize()
72+
{
73+
IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());
74+
}
75+
}
76+
77+
public class MigratorRunner : ITransientDependency
78+
{
79+
private readonly AppTestMigrator _appTestMigrator;
80+
81+
public MigratorRunner(AppTestMigrator appTestMigrator)
82+
{
83+
_appTestMigrator = appTestMigrator;
84+
}
85+
86+
public void Run()
87+
{
88+
_appTestMigrator.CreateOrMigrateForHost();
89+
}
90+
}
91+
92+
public class AppTestMigrator : AbpZeroDbMigrator<AppDbContext>
93+
{
94+
public AppTestMigrator(
95+
IUnitOfWorkManager unitOfWorkManager,
96+
IDbPerTenantConnectionStringResolver connectionStringResolver,
97+
IIocResolver iocResolver,
98+
IDbContextResolver dbContextResolver)
99+
: base(unitOfWorkManager,
100+
connectionStringResolver,
101+
iocResolver,
102+
dbContextResolver)
103+
{
104+
105+
}
106+
}
107+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
using System.Reflection;
2+
using System.Runtime.CompilerServices;
3+
using System.Runtime.InteropServices;
4+
5+
// General Information about an assembly is controlled through the following
6+
// set of attributes. Change these attribute values to modify the information
7+
// associated with an assembly.
8+
[assembly: AssemblyConfiguration("")]
9+
[assembly: AssemblyCompany("")]
10+
[assembly: AssemblyProduct("Abp.Zero.SampleApp.EntityFrameworkCore.ConsoleAppTest")]
11+
[assembly: AssemblyTrademark("")]
12+
13+
// Setting ComVisible to false makes the types in this assembly not visible
14+
// to COM components. If you need to access a type in this assembly from
15+
// COM, set the ComVisible attribute to true on that type.
16+
[assembly: ComVisible(false)]
17+
18+
// The following GUID is for the ID of the typelib if this project is exposed to COM
19+
[assembly: Guid("25f73233-3922-4bc0-ac1c-2042613dec5e")]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?xml version="1.0" encoding="utf-8" ?>
2+
<log4net>
3+
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender" >
4+
<file value="Logs/Logs.txt" />
5+
<appendToFile value="true" />
6+
<rollingStyle value="Size" />
7+
<maxSizeRollBackups value="10" />
8+
<maximumFileSize value="10000KB" />
9+
<staticLogFileName value="true" />
10+
<layout type="log4net.Layout.PatternLayout">
11+
<conversionPattern value="%-5level %date [%-5.5thread] %-40.40logger - %message%newline" />
12+
</layout>
13+
</appender>
14+
<root>
15+
<appender-ref ref="RollingFileAppender" />
16+
<level value="DEBUG" />
17+
</root>
18+
<logger name="NHibernate">
19+
<level value="WARN" />
20+
</logger>
21+
</log4net>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
{
2+
"version": "1.0.0-*",
3+
"buildOptions": {
4+
"emitEntryPoint": true,
5+
"copyToOutput": "log4net.config"
6+
},
7+
8+
"dependencies": {
9+
"Abp.Castle.Log4Net": "0.11.1",
10+
"Abp.Zero.SampleApp.EntityFrameworkCore": "1.0.0-*",
11+
"Castle.Windsor.MsDependencyInjection": "1.0.0",
12+
"Castle.LoggingFacility.MsLogging": "1.0.0"
13+
},
14+
15+
"frameworks": {
16+
"net461": {
17+
18+
}
19+
}
20+
}

‎test/Abp.Zero.SampleApp.EntityFrameworkCore.Tests/SampleAppTestModule.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
namespace Abp.Zero.SampleApp.EntityFrameworkCore.Tests
1313
{
1414
[DependsOn(
15-
typeof(SampleAppEntityFrameworkModule),
15+
typeof(SampleAppEntityFrameworkCoreModule),
1616
typeof(AbpTestBaseModule))]
1717
public class SampleAppTestModule : AbpModule
1818
{
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
using Microsoft.EntityFrameworkCore;
2+
using Microsoft.EntityFrameworkCore.Infrastructure;
3+
4+
namespace Abp.Zero.SampleApp.EntityFrameworkCore
5+
{
6+
/* This class is needed to run "dotnet ef ..." commands from command line on development. Not used anywhere else */
7+
public class AbpProjectNameDbContextFactory : IDbContextFactory<AppDbContext>
8+
{
9+
public AppDbContext Create(DbContextFactoryOptions options)
10+
{
11+
var builder = new DbContextOptionsBuilder<AppDbContext>();
12+
13+
builder.UseSqlServer("Server=localhost; Database=AbpZeroMigrateTest; Trusted_Connection=True;");
14+
15+
return new AppDbContext(builder.Options);
16+
}
17+
}
18+
}

‎test/Abp.Zero.SampleApp.EntityFrameworkCore/Migrations/20160901080154_InitialMigration.Designer.cs

+916
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎test/Abp.Zero.SampleApp.EntityFrameworkCore/Migrations/20160901080154_InitialMigration.cs

+733
Large diffs are not rendered by default.

‎test/Abp.Zero.SampleApp.EntityFrameworkCore/Migrations/AppDbContextModelSnapshot.cs

+915
Large diffs are not rendered by default.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
namespace Abp.Zero.SampleApp.EntityFrameworkCore
2+
{
3+
/* WORKAROUND
4+
* This is needed since .NET CLI does not support class library projects!
5+
* See https://docs.efproject.net/en/latest/cli/dotnet.html#preview-1-known-issues
6+
*/
7+
public class Program
8+
{
9+
public static void Main()
10+
{
11+
12+
}
13+
}
14+
}

‎test/Abp.Zero.SampleApp.EntityFrameworkCore/SampleAppEntityFrameworkModule.cs ‎test/Abp.Zero.SampleApp.EntityFrameworkCore/SampleAppEntityFrameworkCoreModule.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
namespace Abp.Zero.SampleApp.EntityFrameworkCore
66
{
77
[DependsOn(typeof(AbpZeroEntityFrameworkCoreModule), typeof(SampleAppModule))]
8-
public class SampleAppEntityFrameworkModule : AbpModule
8+
public class SampleAppEntityFrameworkCoreModule : AbpModule
99
{
1010
public override void Initialize()
1111
{

‎test/Abp.Zero.SampleApp.EntityFrameworkCore/project.json

+20-2
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,31 @@
33

44
"dependencies": {
55
"Abp.Zero.SampleApp": "0.11.0.2-*",
6-
"Abp.Zero.EntityFrameworkCore": "0.11.0.2-*"
6+
"Abp.Zero.EntityFrameworkCore": "0.11.0.2-*",
7+
"Microsoft.EntityFrameworkCore.SqlServer": "1.0.0",
8+
"Microsoft.EntityFrameworkCore.SqlServer.Design": {
9+
"version": "1.0.0",
10+
"type": "build"
11+
},
12+
"Microsoft.EntityFrameworkCore.Tools": {
13+
"version": "1.0.0-preview2-final",
14+
"type": "build"
15+
}
16+
},
17+
18+
"tools": {
19+
"Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final"
20+
},
21+
22+
"buildOptions": {
23+
"emitEntryPoint": true
724
},
825

926
"frameworks": {
1027
"net461": {
1128
"frameworkAssemblies": {
12-
}
29+
},
30+
"Microsoft.NETCore.App": "1.0.0"
1331
}
1432
}
1533
}

0 commit comments

Comments
 (0)
Please sign in to comment.