在 Entity Framework Code-First 中,您可以根据模型中的代码更改启用自动迁移。
通过调用clone
,这些更改是:
Update-Database
在[timestamp]_AutomaticMigration
表中,迁移在Model列中描述为一个大十六进制值。例如:
__MigrationHistory
在Visual Studio中的程序包管理器控制台中,您可以使用0x1F8B0800000000000400CD57CD6EDB3810BE2FB0EF20F0B40512313F976D20B5C8CAC9C2D83A09AAB4775A1ADBC492944A5281FD6C3DF491FA0A1D...
检索自动迁移列表。
然而,似乎没有办法检索特定自动迁移的细节 - 无论是SQL脚本,还是哪种模型和&田地受到影响。
有没有办法让我不知道要检索特定自动迁移的详细信息?
答案 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,您可以
按Windows,然后搜索此名称 VS2015的开发人员命令提示
在 C:\ ProgramData \ Microsoft \ Windows \ Start Menu \ Programs \ Visual Studio 2015 \ Visual Studio Tools
中打开打开cmd会话,然后执行以下命令
csi DecompileMigration.csx
在菜单call "%vs140comntools%vsdevcmd.bat"
如果使用此选项,则脚本中的VIEW > Other Windows > C# Interactive
成员将不起作用,因此您必须替换数据库名称的Args
和数据库名称的Args[0]
。< / p>
答案 1 :(得分:1)
这个问题来自于自动迁移与显式迁移之间的误解。
我认为显式迁移需要您编写所有上/下更改。
带有迁移更改的 Add-Migration
自动迁移会自动将其添加到显式迁移文件中。
在显式迁移后调用Update-Database
将迁移更改,但现在使用详细说明更改的代码文件。