
ãããããããMSSQL DBMSã§EF 6ã«ãããžã§ã¯ãããããŸããã ãŸããPostgreSQLãšé£æºããæ©èœãè¿œå ããå¿ èŠããããŸããã ãã®ãããã¯ã«ã€ããŠã¯å€æ°ã®èšäºãããããã©ãŒã©ã ã§ã¯åæ§ã®åé¡ã®è°è«ãèŠã€ããããšãã§ãããããããã§ã¯åé¡ãæ³å®ããŠããŸããã§ããã ãã ããå®éã«ã¯ããã¹ãŠãããã»ã©åçŽã§ãããšã¯éããŸããã§ããããã®èšäºã§ã¯ããã®çµéšãæ°ãããããã€ããŒã®çµ±åäžã«çºçããåé¡ãéžæãããœãªã¥ãŒã·ã§ã³ã«ã€ããŠèª¬æããŸãã
å ¥é
ç®±å ¥ãã®è£œåãããããã§ã«ç¢ºç«ãããæ§é ãæã£ãŠããŸãã æåã¯ã1ã€ã®DBMS-MSSQLã§åäœããããã«æ§æãããŠããŸããã ãããžã§ã¯ãã«ã¯ãEF 6å®è£ ïŒã³ãŒããã¡ãŒã¹ãã¢ãããŒãïŒã®ããŒã¿ã¢ã¯ã»ã¹ã¬ã€ã€ãŒããããŸãã EF 6 MigrationsãéããŠç§»è¡ãåŠçããŸãã 移è¡ã¯æåã§äœæãããŸãã ããŒã¿ããŒã¹ã®åæã€ã³ã¹ããŒã«ã¯ãåŒæ°ãšããŠæž¡ãããæ¥ç¶æååã®ã³ã³ããã¹ãã®åæåãšãšãã«ãã³ã³ãœãŒã«ã¢ããªã±ãŒã·ã§ã³ããè¡ãããŸãã
static void Main(string[] args) { if (args.Length == 0) { throw new Exception("No arguments in command line"); } var connectionString = args[0]; Console.WriteLine($"Initializing dbcontext via {connectionString}"); try { using (var context = MyDbContext(connectionString)) { Console.WriteLine("Database created"); } } catch (Exception e) { Console.WriteLine(e.Message); throw; } }
åæã«ãEFã€ã³ãã©ã¹ãã©ã¯ãã£ãšãã¡ã€ã³ãã¡ã€ã³ã¯ãã©ã€ãã©ãªãšããŠã³ã³ãœãŒã«ã¢ããªã±ãŒã·ã§ã³ã«æ¥ç¶ãããŠããå¥ã®ãããžã§ã¯ãã§èª¬æãããŠããŸãã ã€ã³ãã©ã¹ãã©ã¯ãã£ãããžã§ã¯ãã®ã³ã³ããã¹ãã³ã³ã¹ãã©ã¯ã¿ãŒã¯æ¬¡ã®ããã«ãªããŸãã
public class MyDbContext : IdentityDbContext<User, Role, Key, UserLogin, UserRole, UserClaim>, IUnitOfWork { public MyDbContext(string connectionString) : base(connectionString) { Database.SetInitializer(new DbInitializer()); Database.Initialize(true); } }
æåã®æã¡äžã
æåã«è¡ã£ãã®ã¯ãNugetãä»ããŠ2ã€ã®ããã±ãŒãžããããžã§ã¯ãã«æ¥ç¶ããããšã§ããïŒNpgsqlãšEntityFramework6.Npgsqlã
ãŸããPostgresã®ã³ã³ãœãŒã«ã¢ããªã±ãŒã·ã§ã³èšå®ã®App.configã«ãç»é²ãããŠããŸãã
entityFrameworkã»ã¯ã·ã§ã³ã¯ãããã©ã«ãã®postgresãã¡ã¯ããªãæ¥ç¶ãã¡ã¯ããªãšããŠæå®ããŸããã
<entityFramework> <!--<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />--> <defaultConnectionFactory type="Npgsql.NpgsqlConnectionFactory, EntityFramework6.Npgsql" /> <providers> <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> <provider invariantName="Npgsql" type="Npgsql.NpgsqlServices, EntityFramework6.Npgsql" /> </providers> </entityFramework>
DbProviderFactoriesã»ã¯ã·ã§ã³ã§ãæ°ãããããã€ããŒã®ãã¡ã¯ããªãŒãç»é²ãããŸããã
<system.data> <DbProviderFactories> <add name="Npgsql Data Provider" invariant="Npgsql" support="FF" description=".Net Framework Data Provider for Postgresql" type="Npgsql.NpgsqlFactory, Npgsql" /> </DbProviderFactories> </system.data>
ãããŠããã«ã圌ãã¯æ¥ç¶æååã«PostgresãµãŒããŒã¢ãã¬ã¹ãšãµãŒããŒç®¡çè è³æ Œæ å ±ã瀺ããŠãããŒã¿ããŒã¹é¡ãåæåããããšããŸããã çµæã¯æ¬¡ã®è¡ã§ãã
ããµãŒããŒ= localhost; ããŒã¿ããŒã¹= TestPostgresDB; çµ±åã»ãã¥ãªãã£= false; ãŠãŒã¶ãŒID = postgres; ãã¹ã¯ãŒã= pa $$ w0rdâäºæ³ã©ãããæåã®EF移è¡ã¢ãŒãã®ãããã§ãåæåã¯æ©èœãããçŸåšã®ã¢ãã«ã®ããŒã¿ããŒã¹ã€ã¡ãŒãžãšäžèŽããªããšã©ãŒãçºçããŸããã æ°ãããããã€ããŒã䜿çšãããã©ã€ããªç§»è¡ã®äœæãåé¿ããPostgresã§ããŒã¿ããŒã¹ã®åæåããã¹ãããããã«ãã€ã³ãã©ã¹ãã©ã¯ãã£æ§æããããã«èª¿æŽããŸããã
æåã«ããèªå移è¡ããæå¹ã«ããŸãããããã¯ãããéçºè ãããŒã å ã®ãã¡ã€ã³ã¢ãã«ãšEFã€ã³ãã©ã¹ãã©ã¯ãã£ã«å€æŽãå ããå Žåã«äŸ¿å©ãªãªãã·ã§ã³ã§ãã
public sealed class Configuration : DbMigrationsConfiguration<MyDbContext> { public Configuration() { AutomaticMigrationsEnabled = true; ContextKey = "Project.Infrastructure.MyDbContext"; } }
次ã«ãç¶æ¿ã¯ã©ã¹CreateDatabaseIfNotExistsã®åå®çŸ©ãããã¡ãœããInitializeDatabaseã§æ°ãããããã€ããŒãæå®ãã移è¡ãéå§ããŸãã
public class DbInitializer : CreateDatabaseIfNotExists<MyDbContext> { public override void InitializeDatabase(MyDbContext context) { DbMigrator dbMigrator = new DbMigrator(new Configuration { //TargetDatabase = new DbConnectionInfo(context.Database.Connection.ConnectionString, "System.Data.SqlClient") TargetDatabase = new DbConnectionInfo(context.Database.Connection.ConnectionString, "Npgsql") }); // There some code for run migrations } }
次ã«ãåãæ¥ç¶æååãåŒæ°ãšããŠäœ¿çšããŠãã³ã³ãœãŒã«ã¢ããªã±ãŒã·ã§ã³ãå床起åããŸããã ä»åãã³ã³ããã¹ãã®åæåã¯ãšã©ãŒãªãã§è¡ããããã¡ã€ã³ã¢ãã«ã¯æ°ããPostgresããŒã¿ããŒã¹ã«å®å šã«é©åããŸããã ã__MigrationHistoryãã©ãã«ãæ°ããããŒã¿ããŒã¹ã«è¡šç€ºãããæåã«èªåäœæããã移è¡ã®åäžã®ã¬ã³ãŒãããããŸããã
èŠçŽãããšãåé¡ãªãæ°ãããããã€ããŒãæ¢åã®ãããžã§ã¯ãã«æ¥ç¶ããããšãã§ããŸããããåæã«ç§»è¡ã¡ã«ããºã ã®èšå®ãå€æŽããŸããã
æå移è¡ã¢ãŒãããªã³ã«ãã
åè¿°ã®ããã«ãèªå移è¡ã¢ãŒããæå¹ã«ãªã£ãŠããå Žåããã¡ã€ã³ããã³ããŒã¿ã¢ã¯ã»ã¹é åã§ã®äžŠè¡éçºãããŒã ãã奪ããŸãã ç§ãã¡ã«ãšã£ãŠããã®ãªãã·ã§ã³ã¯åãå ¥ããããŸããã§ããã ãã®ããããããžã§ã¯ãã§æå移è¡ã¢ãŒããèšå®ããå¿ èŠããããŸããã
æåã«ãAutomaticMigrationsEnabledãã£ãŒã«ããfalseã«æ»ããŸããã 次ã«ãæ°ãã移è¡ã®äœæã«å¯ŸåŠããå¿ èŠããããŸããã ç°ãªãDBMSã®ç§»è¡ã¯ãå°ãªããšãç°ãªããããžã§ã¯ããã©ã«ããŒã«ä¿åããå¿ èŠãããããšãç解ããŸããã ãã®ãããPostgresMigrationsãšåŒã°ããã€ã³ãã©ã¹ãã©ã¯ãã£ãããžã§ã¯ãã«Postgres移è¡çšã®æ°ãããã©ã«ããŒïŒMsSql移è¡ããããã©ã«ããŒãããããããããããã«MsSqlMigrationsãšååãå€æŽããŸããïŒãäœæããMsSql移è¡æ§æãã¡ã€ã«ãã³ããŒããããšã«ããŸããã åæã«ãæ¢åã®MsSql移è¡ã®ãã¹ãŠãPostgresSqlã«ã³ããŒããŸããã§ããã ãŸãããããã«ã¯ãã¹ãŠMsSqlãããã€ããŒã®æ§æã®ã¹ãããã·ã§ãããå«ãŸããŠãããããæ°ããDBMSã§ãããã䜿çšããããšã¯ã§ããŸããã 第äºã«ãå€æŽã®å±¥æŽã¯æ°ããDBMSã«ãšã£ãŠéèŠã§ã¯ãªãããã¡ã€ã³ã¢ãã«ã®ç¶æ ã®ææ°ã®ã¹ãããã·ã§ããã§å¯ŸåŠã§ããŸãã
ç§ãã¡ã¯ããã¹ãŠãPostgresãžã®æåã®ç§»è¡ã圢æããæºåãã§ããŠãããšèããŸããã èªå移è¡ã¢ãŒãããªã³ã«ããŠã³ã³ããã¹ãã®åæåäžã«äœæãããããŒã¿ããŒã¹ãåé€ãããŸããã ãŸããæåã®ç§»è¡ã§ã¯ããã¡ã€ã³ã¢ãã«ã®çŸåšã®ç¶æ ã«åºã¥ããŠç©çããŒã¿ããŒã¹ãäœæããå¿ èŠããããšããäºå®ã«åºã¥ããŠãæ¥ç¶æååãã©ã¡ãŒã¿ãŒã®ã¿ãæå®ããŠãããã±ãŒãžãããŒãžã£ãŒã³ã³ãœãŒã«ã§Update-Databaseã³ãã³ããåãã§æ¡ç¹ããŸããã ãã®çµæãDBMSãžã®æ¥ç¶ã«é¢é£ãããšã©ãŒãçºçããŸããã
ããŒã¿ããŒã¹ã®æŽæ°ããŒã ãã©ã®ããã«æ©èœããããããã«æ€èšããŠã次ã®ããšãè¡ããŸããã
- 次ã®ã³ãŒãã移è¡æ§æèšå®ã«è¿œå ããŸããã
MsSqlã®å ŽåïŒ
public Configuration() { AutomaticMigrationsEnabled = false; ContextKey = "Project.Infrastructure.MyDbContext"; MigrationsDirectory = @"MsSqlMigrations"; }
Postgresã®å ŽåïŒ
public Configuration() { AutomaticMigrationsEnabled = false; ContextKey = "Project.Infrastructure.MyDbContext"; MigrationsDirectory = @"PostgresMigrations"; }
- ãããã€ããŒã®ååãæž¡ãUpdate-Databaseã³ãã³ãã®å¿ èŠãªãã©ã¡ãŒã¿ãŒã瀺ããŸãã
- efã€ã³ãã©ã¹ãã©ã¯ãã£ã®èª¬æãå«ããããžã§ã¯ããããã³æ°ãããããã€ããŒã®ç§»è¡æ§æãå«ããã©ã«ããŒã瀺ããã©ã¡ãŒã¿ãŒãè¿œå ããŸãã
ãã®çµæã次ã®ã³ãã³ããååŸãããŸããã
ããŒã¿ããŒã¹ã®æŽæ°-ProjectName "Project.Infrastructure" -ConfigurationTypeName Project.Infrastructure.PostgresMigrations.Configuration -ConnectionString "Server = localhost; ããŒã¿ããŒã¹= TestPostgresDB; çµ±åã»ãã¥ãªãã£= false; ãŠãŒã¶ãŒID = postgres; ãã¹ã¯ãŒã= pa $$ w0rd "-ConnectionProviderName" Npgsql "ãã®ã³ãã³ããå®è¡ããåŸãåæ§ã®ãã©ã¡ãŒã¿ãŒã§Add-Migrationã³ãã³ããå®è¡ããæåã®ç§»è¡ã«InitialCreateãšããååãä»ããŸããã
Add-Migration -Name "InitialCreate" -ProjectName "CrossTech.DSS.Infrastructure" -ConfigurationTypeName CrossTech.DSS.Infrastructure.PostgresMigrations.Configuration -ConnectionString "Server = localhost; ããŒã¿ããŒã¹= TestPostgresDB; çµ±åã»ãã¥ãªãã£= false; ãŠãŒã¶ãŒID = postgres; ãã¹ã¯ãŒã= pa $$ w0rd "-ConnectionProviderName" Npgsql "PostgresMigrationsãã©ã«ããŒã«æ°ãããã¡ã€ã«ãåºçŸããŸããïŒ2017010120705068_InitialCreate.cs
次ã«ãUpdate-Databaseã³ãã³ãã®å®è¡åŸã«äœæãããããŒã¿ããŒã¹ãåé€ããäžèšã®æ¥ç¶æååãåŒæ°ãšããŠäœ¿çšããŠã³ã³ãœãŒã«ã¢ããªã±ãŒã·ã§ã³ãèµ·åããŸããã ãã®ãããæåã§äœæãã移è¡ã«åºã¥ããŠããŒã¿ããŒã¹ãæ¢ã«ååŸããŠããŸãã
èŠçŽãããšãæå°éã®åŽåã§ãPostgresãããã€ããŒã®æåã®ç§»è¡ãè¿œå ããã³ã³ãœãŒã«ã¢ããªã±ãŒã·ã§ã³ãä»ããŠã³ã³ããã¹ããåæåããŠãæåã®æå移è¡ããã®å€æŽãå ¥ã£ãæ°ããããŒã¿ããŒã¹ãååŸããããšãã§ããŸããã
ãããã€ããŒãåãæ¿ãã
ãŸã 1ã€ã®æªè§£æ±ºã®è³ªåããããŸãããå®è¡æã«ç¹å®ã®DBMSã«ã¢ã¯ã»ã¹ã§ããããã«ã³ã³ããã¹ãã®åæåãæ§æããæ¹æ³ã§ããã
ã¿ã¹ã¯ã¯ãã³ã³ããã¹ãã®åæå段éã§ãç®çã®ãããã€ããŒã®1ã€ãŸãã¯å¥ã®ã¿ãŒã²ããããŒã¿ããŒã¹ãéžæã§ããããšã§ããã ãã®ã¹ã€ããã®èšå®ãç¹°ãè¿ãè©Šè¡ããçµæã次ã®ãããªãœãªã¥ãŒã·ã§ã³ãæãä»ããŸããã
app.configã®ãããžã§ã¯ãã®ã³ã³ãœãŒã«ã¢ããªã±ãŒã·ã§ã³ïŒããã³app.configã䜿çšããªãå Žåã¯machine.configïŒã§ããããã€ããŒãšæ¥ç¶åã䜿çšããŠæ°ããæ¥ç¶æååãè¿œå ããã³ã³ããã¹ãã³ã³ã¹ãã©ã¯ã¿ãŒã§æ¥ç¶æååã®ä»£ããã«æ¥ç¶åããããããã¹ã«ãŒãããŸãã åæã«ãDbConfigurationã€ã³ã¹ã¿ã³ã¹ã®ã·ã³ã°ã«ãã³ãä»ããŠæ¥ç¶æååèªäœãã³ã³ããã¹ãã«æ¥ç¶ããŸãã DbConfigurationããç¶æ¿ãããã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ããã©ã¡ãŒã¿ãŒãšããŠæž¡ããŸãã
çµæã®ã¬ã¬ã·ãŒDbConfigurationã¯ã©ã¹ïŒ
public class DbConfig : DbConfiguration { public DbConfig(string connectionName, string connectionString, string provideName) { ConfigurationManager.ConnectionStrings.Add(new ConnectionStringSettings(connectionName, connectionString, provideName)); switch (connectionName) { case "PostgresDbConnection": this.SetDefaultConnectionFactory(new NpgsqlConnectionFactory()); this.SetProviderServices(provideName, NpgsqlServices.Instance); this.SetProviderFactory(provideName, NpgsqlFactory.Instance); break; case "MsSqlDbConnection": this.SetDefaultConnectionFactory(new SqlConnectionFactory()); this.SetProviderServices(provideName, SqlProviderServices.Instance); this.SetProviderFactory(provideName, SqlClientFactory.Instance); this.SetDefaultConnectionFactory(new SqlConnectionFactory()); break; } } }
ãããŠãã³ã³ããã¹ãã®åæåèªäœã¯æ¬¡ã®ããã«ãªããŸãã
var connectionName = args[0]; var connectionString = args[1]; var provideName = args[2]; DbConfiguration.SetConfiguration(new DbConfig(connectionName, connectionString, provideName)); using (var context = MyDbContext(connectionName)) { Console.WriteLine("Database created"); }
ãããŠãæ éã«ãã©ããŒãã人ã¯ãããããã³ãŒãã«ãã1ã€å€æŽãå ããå¿ èŠãããããšã«æ°ä»ããã§ãããã ããã¯ãåè¿°ã®InitializeDatabaseã¡ãœããã§çºçããããŒã¿ããŒã¹åæåäžã®ã¿ãŒã²ããããŒã¿ããŒã¹ã®å®çŸ©ã§ãã
ç¹å®ã®ãããã€ããŒã®ç§»è¡æ§æã決å®ããåçŽãªã¹ã€ãããè¿œå ããŸããã
public class DbInitializer : CreateDatabaseIfNotExists<MyDbContext> { private string _connectionName; public DbInitializer(string connectionName) { _connectionName = connectionName; } public override void InitializeDatabase(MyDbContext context) { DbMigrationsConfiguration<MyDbContext> config; switch (_connectionName) { case "PostgresDbConnection": config = new PostgresMigrations.Configuration(); break; case "MsSqlDbConnection": config = new MsSqlMigrations.Configuration(); break; default: config = null; break; } if (config == null) return; config.TargetDatabase = new DbConnectionInfo(_connectionName); DbMigrator dbMigrator = new DbMigrator(config); // There some code for run migrations } }
ãããŠãã³ã³ããã¹ãã³ã³ã¹ãã©ã¯ã¿ãŒèªäœã¯æ¬¡ã®ããã«ãªãå§ããŸããã
public MyDbContext(string connectionNameParam) : base(connectionString) { Database.SetInitializer(new DbInitializer(connectionName = connectionNameParam)); Database.Initialize(true); }
次ã«ãã³ã³ãœãŒã«ã¢ããªã±ãŒã·ã§ã³ãèµ·åããMsSqlã¢ããªã±ãŒã·ã§ã³ãã©ã¡ãŒã¿ãŒãDBMSãããã€ããŒãšããŠæå®ããŸããã ã¢ããªã±ãŒã·ã§ã³ã®åŒæ°ã次ã®ããã«èšå®ããŸãã
"MsSqlDbConnection" "ãµãŒããŒ= localhost \ SQLEXPRESS; ããŒã¿ããŒã¹= TestMsSqlDB; ãŠãŒã¶ãŒID = sa; ãã¹ã¯ãŒã= pa $$ w0rd "" System.Data.SqlClient "
MsSqlããŒã¿ããŒã¹ã¯ãšã©ãŒãªãã§äœæãããŸããã
次ã«ãã¢ããªã±ãŒã·ã§ã³ã®åŒæ°ãæå®ããŸããã
"PostgresDbConnection" "ãµãŒããŒ= localhost; ããŒã¿ããŒã¹= TestPostgresDB; çµ±åã»ãã¥ãªãã£= false; ãŠãŒã¶ãŒID = postgres; ãã¹ã¯ãŒã= pa $$ w0rd "" Npgsql "PostgresããŒã¿ããŒã¹ããšã©ãŒãªãã§äœæãããŸããã
ãããã£ãŠããã1ã€ã®å°èš-EFãç¹å®ã®ãããã€ããŒã®ããŒã¿ããŒã¹ã³ã³ããã¹ããåæåããã«ã¯ãå®è¡æã«ä»¥äžãå¿ èŠã§ãã
- ãã®ãããã€ããŒãžã®ç§»è¡ã¡ã«ããºã ãã瀺ãã
- ã³ã³ããã¹ãã®åæåã®åã«DBMSæ¥ç¶æååãæ§æãã
ããŒã ã§2ã€ã®DBMSã®ç§»è¡ã«åãçµã¿ãŸã
èŠãŠããããã«ãæãèå³æ·±ãéšåã¯ããã¡ã€ã³ã«æ°ããå€æŽãåºçŸããåŸã«å§ãŸããŸãã ç¹å®ã®ãããã€ããŒãèæ ®ããŠã2ã€ã®DBMSã®ç§»è¡ãçæããå¿ èŠããããŸãã
ãã®ãããMSSQL Serverã®å Žåãã·ãŒã±ã³ã·ã£ã«ã³ãã³ããå®è¡ããå¿ èŠããããŸãïŒæåã®ç§»è¡ãäœæãããšãã«ãäžèšã®ã³ãã³ãã§ããPostgresã®å ŽåïŒã
- æåŸã®ã¹ãããã·ã§ããã«åŸã£ãŠããŒã¿ããŒã¹ãæŽæ°ãã
ããŒã¿ããŒã¹ã®æŽæ°-ProjectName "Project.Infrastructure" -ConfigurationTypeName Project.Infrastructure.MsSqlMigrations.Configuration -ConnectionString "Server = localhost; ããŒã¿ããŒã¹= TestMsSqlDB; çµ±åã»ãã¥ãªãã£= false; ãŠãŒã¶ãŒID = sa; ãã¹ã¯ãŒã= pa $$ w0rd "-ConnectionProviderName" System.Data.SqlClient "
- æ°ãã移è¡ãè¿œå ãã
Add-Migration -Name "SomeMigrationName" -ProjectName "Project.Infrastructure" -ConfigurationTypeName Project.Infrastructure.MsSqlMigrations.Configuration -ConnectionString "Server = localhost; ããŒã¿ããŒã¹= TestMsSqlDB; çµ±åã»ãã¥ãªãã£= false; ãŠãŒã¶ãŒID = sa; ãã¹ã¯ãŒã= pa $$ w0rd "-ConnectionProviderName" System.Data.SqlClient "
éçºè ããã¡ã€ã³ã«äžŠè¡ããŠå€æŽãå ãããšãããŒãžã§ã³ç®¡çã·ã¹ãã ã§ãããã®å€æŽãããŒãžãããšãã«è€æ°ã®ç«¶åãçºçããŸãïŒç°¡åã«ããããã«gitãšåŒã³ãŸãïŒã ããã¯ãEFãžã®ç§»è¡ã次ã ãšé£ç¶ããŠè¡ãããããã§ãã ãŸããããéçºè ã移è¡ãäœæããå Žåãå¥ã®éçºè ã¯ç§»è¡ãé£ç¶ããŠè¿œå ããããšã¯ã§ããŸããã åŸç¶ã®å移è¡ã«ã¯ãåã®ç§»è¡ã«é¢ããæ å ±ãä¿åãããŸãã ãããã£ãŠã移è¡ã®ããããã¢ãã«ã®ã¹ãããã·ã§ãããæåŸã«äœæãããã¹ãããã·ã§ããã«æŽæ°ããå¿ èŠããããŸãã
åæã«ãããŒã å ã§ã®EF移è¡ã®ç«¶åã®è§£æ±ºã¯ãç¹å®ã®éçºè ã®å€æŽã®éèŠæ§ãåªå ããããšã«åž°çããŸãã ãŸããå€æŽã®åªå 床ãé«ãå Žåã¯ãããããæåã«gitã«å ¥åããå¿ èŠããããåæãããéå±€ã«åŸã£ãŠä»ã®éçºè ã¯æ¬¡ã®ããšãè¡ãå¿ èŠããããŸãã
- äœæãããããŒã«ã«ç§»è¡ãåé€ãã
- ãªããžããªããèªåèªèº«ã«å€æŽããã«ããŸããåªå 床ã®é«ãä»ã®ååãæ¢ã«ç§»è¡ã泚ã蟌ãã§ããŸãã
- ããŒã«ã«ç§»è¡ãäœæããçµæã®å€æŽãgitã«ã¢ããããŒãããŸã
EFã®ç§»è¡ã¡ã«ããºã ã«ç²ŸéããŠããéãã説æãããŠããããŒã éçºã¢ãããŒãã¯çŸæç¹ã§å¯äžã®ãã®ã§ãããšå€æã§ããŸãã ãã®ãœãªã¥ãŒã·ã§ã³ã¯çæ³çã§ã¯ãããŸããããçåœã«å¯Ÿããæš©å©ããããŸãã ãããŠãEF Migrationsã¡ã«ããºã ã«ä»£ãããã®ãèŠã€ãããšããåé¡ãç§ãã¡ã«ãšã£ãŠç·æ¥ã«ãªã£ãŠããŸãã
çµè«ãšããŠ
EF Migrationsãšçµã¿åãããŠEF6ã䜿çšããŠããã€ãã®DBMSãæäœããããšã¯çŸå®ã§ããããã®ããŒãžã§ã³ã§ã¯ãMicrosoftã®ã¹ã¿ããã¯ããŒãžã§ã³ç®¡çã·ã¹ãã ã䜿çšããããŒã ã®äžŠè¡äœæ¥ã®å¯èœæ§ãèæ ®ããŸããã§ããã
åžå Žã«ã¯ãDbUpãRoundhousEãThinkingHome.MigratorãFluentMigratorãªã©ãå€ãã®ä»£æ¿EF移è¡ãœãªã¥ãŒã·ã§ã³ïŒææããã³ç¡æïŒããããŸãã ã¬ãã¥ãŒããå€æãããšã圌ãã¯EF Migrationsãããéçºè ã«äŒŒãŠããŸãã
幞ããªããšã«ããããžã§ã¯ãã§äœããã®ã¢ããã°ã¬ãŒããè¡ãæ©äŒããããŸãã ãããŠè¿ãå°æ¥ãEF Coreã«åãæ¿ããŸãã EF Core Migrationsã¡ã«ããºã ã®é·æãšçæãæ¯èŒæ€èšãããµãŒãããŒãã£ã®ãœãªã¥ãŒã·ã§ã³ïŒFluent MigratorïŒã䜿çšããæ¹ã䟿å©ã ãšããçµè«ã«éããŸããã
ããªããç§ãã¡ã®çµéšã«èå³ãæã£ãŠããããšãé¡ã£ãŠããŸãã Wellcomeãã³ã¡ã³ããåãå ¥ããŠè³ªåã«çããæºåãã§ããŸããïŒ