如何描述自动迁移的详细信息

时间:2016-01-08 11:36:59

标签: c# .net ef-code-first entity-framework-6 automatic-migration

Entity Framework Code-First 中,您可以根据模型中的代码更改启用自动迁移。

通过调用clone,这些更改是:

  1. Update-Database
  2. 中注册
  3. 生成SQL脚本并迁移数据库
  4. 将迁移存储在表__MigrationHistory
  5. [timestamp]_AutomaticMigration表中,迁移在Model列中描述为一个大十六进制值。例如:

    __MigrationHistory

    在Visual Studio中的程序包管理器控制台中,您可以使用0x1F8B0800000000000400CD57CD6EDB3810BE2FB0EF20F0B40512313F976D20B5C8CAC9C2D83A09AAB4775A1ADBC492944A5281FD6C3DF491FA0A1D... 检索自动迁移列表。

    然而,似乎没有办法检索特定自动迁移的细节 - 无论是SQL脚本,还是哪种模型和&田地受到影响。

    有没有办法让我不知道要检索特定自动迁移的详细信息?

2 个答案:

答案 0 :(得分:3)

是的,有。

表__MigrationHistory中的这个值是一个GZiped Xml,它包含EDMX模式。

我制作了以下代码来检索EDMX模型(此代码使用C#6

  

您也可以通过以下链接访问我的要点:https://gist.github.com/AlbertoMonteiro/45198dc80641ce1896e6

     

在这个要点中有一个C#5版本,您可以将其粘贴到控制台应用程序中。

ll

正如您所看到的,在使用Visual Studio Update 1到达的新C#REPL中允许使用某些语法。

所以我用#r "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.Data.dll" #r "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.Xml.Linq.dll" using System.Xml.Linq; using System.IO.Compression; public void DecompressDatabaseMigration(string migrationName, string databaseName) { var connectionString = $@"Data source=.\sqlexpress;Initial catalog={databaseName};Integrated security=true"; var sqlToExecute = String.Format("select model from __MigrationHistory where migrationId like '%{0}'", migrationName); using (var connection = new SqlConnection(connectionString)) { connection.Open(); var command = new SqlCommand(sqlToExecute, connection); var reader = command.ExecuteReader(); if (!reader.HasRows) { throw new Exception("Now Rows to display. Probably migration name is incorrect"); } while (reader.Read()) { var model = (byte[])reader["model"]; var decompressed = Decompress(model); File.WriteAllText(@"C:\temp\edmx.xml", decompressed.ToString()); } } } public XDocument Decompress(byte[] bytes) { using (var memoryStream = new MemoryStream(bytes)) { using (var gzipStream = new GZipStream(memoryStream, CompressionMode.Decompress)) { return XDocument.Load(gzipStream); } } } DecompressDatabaseMigration(Args[1], Args[0]); 扩展名保存这个文件然后执行,在我的情况下.csx

DecompileMigration.csx

然后脚本会在我的 C:\ temp 文件夹中放入文件 emdx.xml ,然后我会在此特定迁移中看到该模型。

要使用VS 2015更新1的REPL,您可以

加载名为 VS2015的开发人员命令提示符

的自定义CMD

按Windows,然后搜索此名称 VS2015的开发人员命令提示

选项1

C:\ ProgramData \ Microsoft \ Windows \ Start Menu \ Programs \ Visual Studio 2015 \ Visual Studio Tools

中打开

选项2

打开cmd会话,然后执行以下命令

csi DecompileMigration.csx

选项3

在菜单call "%vs140comntools%vsdevcmd.bat"

中的Visual Studio 2015 U1中打开它

C# Interactive

如果使用此选项,则脚本中的VIEW > Other Windows > C# Interactive成员将不起作用,因此您必须替换数据库名称的Args和数据库名称的Args[0]。< / p>

答案 1 :(得分:1)

这个问题来自于自动迁移与显式迁移之间的误解。

我认为显式迁移需要您编写所有上/下更改。

带有迁移更改的

Add-Migration自动迁移会自动将其添加到显式迁移文件中。

在显式迁移后调用Update-Database将迁移更改,但现在使用详细说明更改的代码文件。