рдореБрдЭреЗ рд╕рд╛рдЗрдХрд┐рд▓ рд╕реЗ рдкреНрдпрд╛рд░ рд╣реИред
рдИрдПрдл рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд▓рд┐рдЦрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рд╕рдВрд░рдЪрдирд╛ рдЕрдХреНрд╕рд░ рдмрджрд▓рддреА рд░рд╣рддреА рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╕рдорд╕реНрдпрд╛рдПрдВ рдкреИрджрд╛ рд╣реЛрддреА рд╣реИрдВред рд╕рдВрд╕реНрдХрд░рдг 4.3 рд╕реЗ рдкрд╣рд▓реЗ, рдбреЗрдЯрд╛рдмреЗрд╕ рдбреЗрдЯрд╛ рд╣рд╛рдирд┐ рдФрд░ рдкрд░реАрдХреНрд╖рдг рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреЛ рднрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рд╕рд╛рде рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рд╕рдВрд╕реНрдХрд░рдг 4.3 рд╕реЗред рдкреНрд░рд╡рд╛рд╕рди рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ред
рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдиреЗ рд╕рднреА рдбреЗрдЯрд╛ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд╕рд╛рде рд╕рд┐рд░рджрд░реНрдж рд╕реЗ рд░рд╛рд╣рдд рджреАред рд▓реЗрдХрд┐рди рдбреЗрдЯрд╛рдмреЗрд╕ рдЕрдкрдбреЗрдЯ рддрдВрддреНрд░ рдХрд╛ рдореИрдиреБрдЕрд▓ рд╡рд┐рд╡рд░рдг - рдореИрдВ 2 рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдХреЗ рдмрд╛рдж рдЗрд╕рд╕реЗ рдердХ рдЧрдпрд╛ рд╣реВрдВред рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдорд╛рдЗрдЧреНрд░реЗрд╢рди рд╡рд╣ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдЪрд╛рд╣рд┐рдПред рдПрдХ рдорд╛рдЗрдирд╕, рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдордЬрдмреВрдд рдкрд░рд┐рд╡рд░реНрддрди (рдХреНрд╖реЗрддреНрд░ рдкреНрд░рдХрд╛рд░, 1 рдЯреЗрдмрд▓ рд╕реЗ рджреВрд╕рд░реЗ рдХреНрд╖реЗрддреНрд░) рдХреЗ рд╕рд╛рде - рдбреЗрдЯрд╛ рдЦреЛ рдЬрд╛рддрд╛ рд╣реИред
рдирддреАрдЬрддрди, рдПрдХ рд╕рд╛рдЗрдХрд┐рд▓ рджрд┐рдЦрд╛рдИ рджреАред
рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдмрджрд▓рддреЗ рд╕рдордпред
1. рдЕрдВрддрд┐рдо рдЕрдкрдбреЗрдЯ рд╕реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ;
2. SQL рд╕рд░реНрд╡рд░ рд╕реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдХрд░рддрд╛ рд╣реИ;
3. рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдбреЗрдЯрд╛рдмреЗрд╕ рдлрд╝рд╛рдЗрд▓реЗрдВ (рдореВрд▓ рдХреЗ рдмрдЧрд▓ рдореЗрдВ) FILEBD -> FILEBD_VERSION;
4. рдкреБрд░рд╛рдиреЗ рдирд╛рдо рдХреЗ рддрд╣рдд рдореВрд▓ рдХреЛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ;
5. OLD рдирд╛рдо рдХреЗ рддрд╣рдд рдПрдХ рдкреНрд░рддрд┐ рд╕рдВрд▓рдЧреНрди рдХрд░рддрд╛ рд╣реИред рд╕рдВрд╕реНрдХрд░рдг;
6. рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкреНрд░рд╡рд╛рд╕рди рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ;
7. рдореИрдВ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд▓рд┐рдЦрддрд╛ рд╣реВрдВ;
рдореЗрд░реЗ рд▓рд┐рдП рдореБрдЦреНрдп рд▓рд╛рдн:
1. рдЕрдирд╛рд╡рд╢реНрдпрдХ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рдмрд┐рдирд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдЕрджреНрдпрддрди рдХрд░рдирд╛;
2. рд╕рдВрдЪрд┐рдд рдбреЗрдЯрд╛ рдХреА рд╕реБрд░рдХреНрд╖рд╛, рдЬрд┐рд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЦреАрдВрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рд╣рдо рдЯреА-рдПрд╕рдХреНрдпреВрдПрд▓ рд╕реЗ рдбрд░рддреЗ рдирд╣реАрдВ рд╣реИрдВ :))
public class RenameCreateDatabaseIfModelChanged<TContext> : IDatabaseInitializer<TContext> where TContext : System.Data.Entity.DbContext { public void InitializeDatabase(TContext context) { int version = 1; DbCommand cmd; if (context.Database.Exists()) { bool throwIfNoMetadata = true; if (context.Database.CompatibleWithModel(throwIfNoMetadata)) { return; } DbDataReader dr; context.Database.Connection.Open(); //GET VERSION cmd = context.Database.Connection.CreateCommand(); cmd.CommandText = "SELECT TOP 1 * FROM sysobjects WHERE xtype='U' AND name = '__ase.version'"; dr = cmd.ExecuteReader(); if (dr.Read()) { //VERSION EXISTS dr.Close(); cmd.CommandText = "SELECT TOP 1 Vesion FROM [__ase.version] ORDER BY CreatedOn DESC"; dr = cmd.ExecuteReader(); if (dr.Read()) version = (int)dr["Vesion"]; dr.Close(); version++; } else { //First dr.Close(); cmd.CommandText = "CREATE TABLE [__ase.version] ([Vesion] [int] NOT NULL, [CreatedOn] [datetime] NOT NULL)"; cmd.ExecuteNonQuery(); //WriteVersion(context, version); } //Get list files List<string> files = new List<string>(); cmd.CommandText = "EXEC SP_HELPFILE"; dr = cmd.ExecuteReader(); while (dr.Read()) { files.Add(dr["filename"].ToString()); } dr.Close(); //Disconnect all connections cmd.CommandText = String.Format("ALTER DATABASE [{0}] SET SINGLE_USER WITH ROLLBACK IMMEDIATE", context.Database.Connection.Database); cmd.ExecuteNonQuery(); cmd.CommandText = String.Format("ALTER DATABASE [{0}] SET MULTI_USER WITH ROLLBACK IMMEDIATE", context.Database.Connection.Database); cmd.ExecuteNonQuery(); string dbName = context.Database.Connection.Database; //Deattach database cmd.CommandText = String.Format("USE MASTER; EXEC SP_DETACH_DB [{0}]", dbName); cmd.ExecuteNonQuery(); //Copy database string sql_file_old = String.Format("EXEC SP_ATTACH_DB [{0}], ", dbName); string sql_file_new = String.Format("EXEC SP_ATTACH_DB [{0}.{1}], ", dbName, version); foreach (string file in files) { File.Copy(file, file + "_" + version); sql_file_old += "'" + file + "', "; sql_file_new += "'" + file + "_" + version + "', "; } //Attach database cmd.CommandText = sql_file_old.Substring(0, sql_file_old.Length - 2); cmd.ExecuteNonQuery(); //Attach copy database cmd.CommandText = sql_file_new.Substring(0, sql_file_new.Length - 2); cmd.ExecuteNonQuery(); context.Database.Connection.Close(); } //Migrate with data loss var configuration = new DbMigrationsConfiguration<TContext>(); configuration.AutomaticMigrationDataLossAllowed = true; configuration.AutomaticMigrationsEnabled = true; var migrator = new DbMigrator(configuration); migrator.Update(); //Update version context.Database.Connection.Open(); cmd = context.Database.Connection.CreateCommand(); DbParameter param = cmd.CreateParameter(); param.ParameterName = "@v1"; param.Value = version; cmd.Parameters.Add(param); param = cmd.CreateParameter(); param.ParameterName = "@v2"; param.Value = DateTime.Now; cmd.Parameters.Add(param); cmd.CommandText = "INSERT INTO [__ase.version] ([Vesion], [CreatedOn]) VALUES (@v1, @v2)"; cmd.ExecuteNonQuery(); context.Database.Connection.Close(); } protected virtual void Seed(TContext context) { } } public class InitData : RenameCreateDatabaseIfModelChanged<AppEntities> { protected override void Seed(AppEntities context) { base.Seed(context); } } System.Data.Entity.Database.SetInitializer<AppEntities>(new InitData());