我想做类似的事情,但我总是觉得 Seed 有点暗,因为 Migrations 的重点是版本控制的数据库,而 Seed 命令忽略版本控制 - 所以它很容易让你措手不及。更可取的结果是迁移中的数据移动。所以,我们开始:
(GitHub 上的完整源代码,以及其他一些迁移命令。)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Data.Entity;
using System.Data.Entity.Migrations;
using System.IO;
using System.Text.RegularExpressions;
public abstract class ExpandedDbMigration
: System.Data.Entity.Migrations.DbMigration
{
public void SqlFile(string path)
{
var cleanAppDir = new Regex(@"\\bin.+");
var dir = AppDomain.CurrentDomain.BaseDirectory;
dir = cleanAppDir.Replace(dir, "") + @"\";
var sql = File.ReadAllLines(dir + path);
string[] ignore = new string[]
{
"GO", // Migrations doesn't support GO
"/*", // Migrations might not support comments
"print" // Migrations might not support print
};
foreach (var line in sql)
{
if (ignore.Any(ig => line.StartsWith(ig)))
continue;
Sql(line);
}
}
}
AppDomain
... 为您的模型项目提供正确的目录,而不是像其他方法那样将您指向 Visual Studio。
Regex 清理返回的内容,以防它从 bin 文件夹运行。
ReadAllLines 读取您的 Sql 脚本;在这种情况下,它存储在 \Sql\blah.sql 中,但您可以将其放在其他地方。
foreach/ignore 可以防止像“GO”这样的命令进入,当在迁移中使用时会出错,并且经常从 Sql Server Management Studio Generate Scripts 等工具发出。
最后,foreach 将每一行转储到 Migrations。
用法:
using Brass9.Data.Entity.Migrations;
public partial class FillZips : ExpandedDbMigration
{
public override void Up()
{
SqlFile(@"Migrations\Sql\2013-08-15 FillTable.sql");
}
注意继承的变化,从 DbMigration 到 ExpandedDbMigration。
将 SqlFile 的参数替换为启用迁移的项目中的 sql 文件的路径。