Jo Shields a575963da9 Imported Upstream version 3.6.0
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
2014-08-13 10:39:27 +01:00

263 lines
12 KiB
C#

// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
namespace System.Data.Entity.Migrations
{
using System.Collections.Generic;
using System.Data.Entity.Core.Metadata.Edm;
using System.Data.Entity.Infrastructure;
using System.Data.Entity.Migrations.Design;
using System.Data.Entity.Migrations.History;
using System.Data.Entity.Migrations.Model;
using System.Data.Entity.Utilities;
using System.Linq;
using FunctionalTests.SimpleMigrationsModel;
using Xunit;
[Variant(DatabaseProvider.SqlClient, ProgrammingLanguage.CSharp)]
[Variant(DatabaseProvider.SqlServerCe, ProgrammingLanguage.CSharp)]
[Variant(DatabaseProvider.SqlClient, ProgrammingLanguage.VB)]
public class UpgradeScenarios : DbTestCase
{
public class Ef5MigrationsContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
}
public class Ef5MigrationsConfiguration : DbMigrationsConfiguration<Ef5MigrationsContext>
{
public Ef5MigrationsConfiguration()
{
MigrationsNamespace = "FunctionalTests.SimpleMigrationsModel";
}
}
[MigrationsTheory]
public void Can_upgrade_from_5_and_existing_code_migrations_still_work()
{
ResetDatabase();
var migrationsConfiguration
= new Ef5MigrationsConfiguration
{
TargetDatabase
= new DbConnectionInfo(ConnectionString, TestDatabase.ProviderName)
};
var migrator = new DbMigrator(migrationsConfiguration);
migrator.Update();
Assert.True(TableExists("dbo.Blogs"));
Assert.True(TableExists("dbo." + HistoryContext.TableName));
migrator.Update("0");
Assert.False(TableExists("dbo.Blogs"));
Assert.False(TableExists("dbo." + HistoryContext.TableName));
}
[MigrationsTheory]
public void Can_upgrade_from_5_and_existing_database_migrations_still_work()
{
ResetDatabase();
var migrationsConfiguration
= new Ef5MigrationsConfiguration
{
TargetDatabase
= new DbConnectionInfo(ConnectionString, TestDatabase.ProviderName)
};
var migrator = new DbMigrator(migrationsConfiguration);
migrator.Update();
var historyRepository
= new HistoryRepository(ConnectionString, ProviderFactory, migrationsConfiguration.ContextKey);
ExecuteOperations(
new MigrationOperation[]
{
GetDropHistoryTableOperation(),
GetCreateHistoryTableOperation()
});
var model = CreateContext<Ef5MigrationsContext>().GetModel();
// create v5 history rows
ExecuteOperations(
new[]
{
historyRepository.CreateInsertOperation("201112202056275_InitialCreate", model),
historyRepository.CreateInsertOperation("201112202056573_AddUrlToBlog", model)
});
migrator.Update("0");
Assert.False(TableExists("dbo.Blogs"));
Assert.False(TableExists("dbo." + HistoryContext.TableName));
}
[MigrationsTheory]
public void Can_upgrade_from_5_and_existing_code_auto_migrations_still_work()
{
ResetDatabase();
var migrator = CreateMigrator<ShopContext_v1>();
migrator.Update();
var historyRepository
= new HistoryRepository(ConnectionString, ProviderFactory, "MyKey");
// create v5 history rows
ExecuteOperations(
new[]
{
GetDropHistoryTableOperation(),
GetCreateHistoryTableOperation(),
historyRepository
.CreateInsertOperation(
"201112202056275_NoHistoryModelAutomaticMigration",
CreateContext<ShopContext_v1>().GetModel())
});
migrator = CreateMigrator<ShopContext_v2>();
var scaffoldedMigration
= new MigrationScaffolder(migrator.Configuration).Scaffold("Migration_v2");
ResetDatabase();
migrator
= CreateMigrator<ShopContext_v2>(
scaffoldedMigrations: scaffoldedMigration,
automaticDataLossEnabled: true);
migrator.Update();
Assert.True(TableExists("crm.tbl_customers"));
Assert.True(TableExists("dbo." + HistoryContext.TableName));
migrator.Update("0");
Assert.False(TableExists("crm.tbl_customers"));
Assert.False(TableExists("dbo." + HistoryContext.TableName));
}
[MigrationsTheory]
public void Upgrade_from_earlier_version_should_upgrade_history_table_when_updating_generated()
{
ResetDatabase();
var createTableOperations = GetLegacyHistoryCreateTableOperations();
ExecuteOperations(
createTableOperations.Concat(
new[]
{
new SqlOperation(
@"INSERT INTO [__MigrationHistory] ([MigrationId], [CreatedOn], [Model])
VALUES ('000000000000000_ExistingMigration', GETDATE(), 0x1F8B0800000000000400ECBD07601C499625262F6DCA7B7F4AF54AD7E074A10880601324D8904010ECC188CDE692EC1D69472329AB2A81CA6556655D661640CCED9DBCF7DE7BEFBDF7DE7BEFBDF7BA3B9D4E27F7DFFF3F5C6664016CF6CE4ADAC99E2180AAC81F3F7E7C1F3F22FEC7BFF71F7CFC7BBC5B94E9655E3745B5FCECA3DDF1CE4769BE9C56B36279F1D947EBF67CFBE0A3DFE3E8374E1E9FCE16EFD29F34EDF6D08EDE5C369F7D346FDBD5A3BB779BE93C5F64CD78514CEBAAA9CEDBF1B45ADCCD66D5DDBD9D9D83BBBB3B777302F111C14AD3C7AFD6CBB658E4FC07FD79522DA7F9AA5D67E517D52C2F1BFD9CBE79CD50D317D9226F56D934FFEC236ADB54657EBC5A95C5346B099DDD8FD2E3B2C80895D77979FE9E78ED3C045E1FD91EA9CF53C2ADBDA67EDAAC58E63577CEFDB6F9BBF6A3F4AEC3EEAEA067867177601C8FBFC8562B22A8372EFD247DAD83DA7EFDFE782F04C6DD69B3097DDB535BD5D945DEF916E39AE5CF8ABA699F666D36C99AFCA3F464B688348B0C5F61DBF177C6F958FBBCCDA4769090261FA52FEBEAB2980181D7D74D9B2FC668307EFD8BCA93B2C897AD6BF045B62CCEF3A67D53BDCDC1A044A3AFCF160FEFEEEC812DEE36CDACBC156FF468B8814BFA54797CD71788C74FF3A6B820E89E782CF32958DD01356DCE96E715D16095D7EDF5EBBCF571354DCCD78AEC17799BCD08CFE3BA2DCEB3694B5F4FF3A6A179FB28FDC9AC5C5393D3C5249F9D2DBF5CB7AB757BDC34F962525E8763DADC3F8B4288F3E32F57F8CB6383AF3F0442B3A021E45F2E9FAC8B7266F17E969521ED874160CA3ECFE9735621AF5BFA995F5C5B482FAAE52D0129F99EE6AB7C3923967C932F5625016BBE5CBECE2EF361DC6EA66148B1C74F8BECA2CE163E05E513C5E475463D7B5D5007FE1BAE3FFAF3F15D28F4A3FF270000FFFF4817137F02060000)")
}).ToArray());
var migrator = CreateMigrator<ShopContext_v1>();
var generatedMigration = new MigrationScaffolder(migrator.Configuration).Scaffold("Migration1");
migrator = CreateMigrator<ShopContext_v1>(
automaticMigrationsEnabled: false,
scaffoldedMigrations: new[] { generatedMigration });
Assert.False(ColumnExists(HistoryContext.TableName, "ProductVersion"));
Assert.False(ColumnExists(HistoryContext.TableName, "ContextKey"));
Assert.True(ColumnExists(HistoryContext.TableName, "Hash"));
Assert.True(ColumnExists(HistoryContext.TableName, "CreatedOn"));
migrator.Update(generatedMigration.MigrationId);
Assert.True(ColumnExists(HistoryContext.TableName, "ProductVersion"));
Assert.True(ColumnExists(HistoryContext.TableName, "ContextKey"));
Assert.False(ColumnExists(HistoryContext.TableName, "Hash"));
Assert.False(ColumnExists(HistoryContext.TableName, "CreatedOn"));
}
[MigrationsTheory]
public void Upgrade_from_earlier_version_should_upgrade_history_table_when_updating_automatic()
{
ResetDatabase();
var createTableOperations = GetLegacyHistoryCreateTableOperations();
ExecuteOperations(
createTableOperations.Concat(
new[]
{
new SqlOperation(
@"INSERT INTO [__MigrationHistory] ([MigrationId], [CreatedOn], [Model])
VALUES ('000000000000000_ExistingMigration', GETDATE(), 0x1F8B0800000000000400ECBD07601C499625262F6DCA7B7F4AF54AD7E074A10880601324D8904010ECC188CDE692EC1D69472329AB2A81CA6556655D661640CCED9DBCF7DE7BEFBDF7DE7BEFBDF7BA3B9D4E27F7DFFF3F5C6664016CF6CE4ADAC99E2180AAC81F3F7E7C1F3F22FEC7BFF71F7CFC7BBC5B94E9655E3745B5FCECA3DDF1CE4769BE9C56B36279F1D947EBF67CFBE0A3DFE3E8374E1E9FCE16EFD29F34EDF6D08EDE5C369F7D346FDBD5A3BB779BE93C5F64CD78514CEBAAA9CEDBF1B45ADCCD66D5DDBD9D9D83BBBB3B777302F111C14AD3C7AFD6CBB658E4FC07FD79522DA7F9AA5D67E517D52C2F1BFD9CBE79CD50D317D9226F56D934FFEC236ADB54657EBC5A95C5346B099DDD8FD2E3B2C80895D77979FE9E78ED3C045E1FD91EA9CF53C2ADBDA67EDAAC58E63577CEFDB6F9BBF6A3F4AEC3EEAEA067867177601C8FBFC8562B22A8372EFD247DAD83DA7EFDFE782F04C6DD69B3097DDB535BD5D945DEF916E39AE5CF8ABA699F666D36C99AFCA3F464B688348B0C5F61DBF177C6F958FBBCCDA4769090261FA52FEBEAB2980181D7D74D9B2FC668307EFD8BCA93B2C897AD6BF045B62CCEF3A67D53BDCDC1A044A3AFCF160FEFEEEC812DEE36CDACBC156FF468B8814BFA54797CD71788C74FF3A6B820E89E782CF32958DD01356DCE96E715D16095D7EDF5EBBCF571354DCCD78AEC17799BCD08CFE3BA2DCEB3694B5F4FF3A6A179FB28FDC9AC5C5393D3C5249F9D2DBF5CB7AB757BDC34F962525E8763DADC3F8B4288F3E32F57F8CB6383AF3F0442B3A021E45F2E9FAC8B7266F17E969521ED874160CA3ECFE9735621AF5BFA995F5C5B482FAAE52D0129F99EE6AB7C3923967C932F5625016BBE5CBECE2EF361DC6EA66148B1C74F8BECA2CE163E05E513C5E475463D7B5D5007FE1BAE3FFAF3F15D28F4A3FF270000FFFF4817137F02060000)")
}).ToArray());
var migrator = CreateMigrator<ShopContext_v1>();
Assert.False(ColumnExists(HistoryContext.TableName, "ProductVersion"));
Assert.False(ColumnExists(HistoryContext.TableName, "ContextKey"));
Assert.True(ColumnExists(HistoryContext.TableName, "Hash"));
Assert.True(ColumnExists(HistoryContext.TableName, "CreatedOn"));
migrator.Update();
Assert.True(ColumnExists(HistoryContext.TableName, "ProductVersion"));
Assert.True(ColumnExists(HistoryContext.TableName, "ContextKey"));
Assert.False(ColumnExists(HistoryContext.TableName, "Hash"));
Assert.False(ColumnExists(HistoryContext.TableName, "CreatedOn"));
}
private IEnumerable<MigrationOperation> GetLegacyHistoryCreateTableOperations()
{
const string tableName = "dbo." + HistoryContext.TableName;
var createTableOperation
= new CreateTableOperation(tableName);
createTableOperation.Columns.Add(
new ColumnModel(PrimitiveTypeKind.String)
{
Name = "MigrationId",
MaxLength = 255,
IsNullable = false
});
createTableOperation.Columns.Add(
new ColumnModel(PrimitiveTypeKind.DateTime)
{
Name = "CreatedOn"
});
createTableOperation.Columns.Add(
new ColumnModel(PrimitiveTypeKind.Binary)
{
Name = "Model"
});
createTableOperation.Columns.Add(
new ColumnModel(PrimitiveTypeKind.String)
{
Name = "Hash"
});
yield return createTableOperation;
var addPrimaryKeyOperation
= new AddPrimaryKeyOperation
{
Table = tableName
};
addPrimaryKeyOperation.Columns.Add("MigrationId");
yield return addPrimaryKeyOperation;
}
}
}