Как я могу запустить серию сценариев sql с EF 4.3 Migrations? - PullRequest
3 голосов
/ 02 апреля 2012

Я пытаюсь сделать что-то подобное в методе 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?

1 Ответ

3 голосов
/ 17 августа 2014

Я хотел сделать что-то подобное, но я всегда находил Seed немного тусклым, учитывая, что точка миграции - это версионная база данных, а команда 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 ... дает вамправильный каталог для вашего проекта Models, вместо того, чтобы указывать вам на Visual Studio, как это делают другие методы.

Regex очищает то, что возвращается, если он запускается из папки bin.

ReadAllLines читает в вашемSQL скрипт;в этом случае он хранится в \ Sql \ blah.sql, но вы можете поместить его в другое место.

Функция foreach / ignore не позволяет входить таким командам, как "GO", что приводит к ошибке при использовании в Migrations, ичасто вызываются из таких инструментов, как 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 внутри вашего проекта с поддержкой миграции.

...