3

我试图在Seed方法中做这样的事情:

foreach (string sqlFile in Directory.GetFiles(Path.Combine(Directory.GetCurrentDirectory(), @"SqlScripts")))
            {
                string sqlText = File.OpenText(sqlFile).ReadToEnd();
                context.Database.ExecuteSqlCommand(sqlText);
            }

当我运行 Update-Database 时,出现错误:

Could not find a part of the path 'C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\SqlScripts'.

很明显,更新数据库是从 VS bin 目录而不是从项目目录运行的。无需对项目路径进行硬编码(有多个开发人员正在为此工作),我该如何获取包含DbContext?

4

1 回答 1

3

我想做类似的事情,但我总是觉得 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 文件的路径。

于 2014-08-17T07:34:39.370 回答