Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用EF 4.3迁移运行一系列sql脚本?_C#_Visual Studio 2010_Entity Framework_Entity Framework 4.3_Entity Framework Migrations - Fatal编程技术网

C# 如何使用EF 4.3迁移运行一系列sql脚本?

C# 如何使用EF 4.3迁移运行一系列sql脚本?,c#,visual-studio-2010,entity-framework,entity-framework-4.3,entity-framework-migrations,C#,Visual Studio 2010,Entity Framework,Entity Framework 4.3,Entity Framework Migrations,我正试图在Seed方法中执行类似的操作: foreach (string sqlFile in Directory.GetFiles(Path.Combine(Directory.GetCurrentDirectory(), @"SqlScripts"))) { string sqlText = File.OpenText(sqlFile).ReadToEnd(); context.Database.Exec

我正试图在
Seed
方法中执行类似的操作:

foreach (string sqlFile in Directory.GetFiles(Path.Combine(Directory.GetCurrentDirectory(), @"SqlScripts")))
            {
                string sqlText = File.OpenText(sqlFile).ReadToEnd();
                context.Database.ExecuteSqlCommand(sqlText);
            }
当我运行更新数据库时,我得到错误:

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

所以很明显,更新数据库是从VS bin目录运行的,而不是从项目目录运行的。在不必硬编码项目路径的情况下(有多个开发人员在做这项工作),如何获取包含
DbContext
的程序集路径?

我想做类似的事情,但考虑到迁移点是一个版本化的数据库,我总是觉得Seed有点模糊,而Seed命令忽略了版本控制,因此它可以很容易地攻击你。更好的结果是迁移中的数据移动。那么,我们开始吧:

()

AppDomain
。。。获取模型项目的正确目录,而不是像其他方法那样将您指向Visual Studio

正则表达式清除返回的内容,以防它是从bin文件夹运行的

ReadAllLines在Sql脚本中读取;在本例中,它存储在\Sql\blah.Sql中,但您可以将其放在其他地方

foreach/ignore阻止像“GO”这样的命令进入,在迁移中使用时会出错,并且经常从SQLServerManagementStudio生成脚本等工具发出

最后,foreach将每一行转储到迁移中

用法:

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文件的路径。

为什么不提供绝对路径?@MikeBantegui,因为并非所有开发人员都使用相同的基本路径。(这让我很恼火,但我无法控制它。)另外,它看起来不雅观。您可以映射到当前正在执行的程序集的绝对路径。请参见此处:@MikeBantegui是的,我尝试了Path.GetDirectoryName(Assembly.getExecutionGassembly().Location)程序集不是从bin目录运行的,它位于'C:\Users\myusername\AppData\Local\assembly\dl3\9D00W24T.P01\L97G1HNR.00Q\7c0bcc72\bc512abc\u 5a10cd01'中。另一种可能的解决方案是将SQL文件添加为资源,只需执行context.Database.ExecuteSqlCommand(resources.XXX.SQL);
using Brass9.Data.Entity.Migrations;

public partial class FillZips : ExpandedDbMigration
{
    public override void Up()
    {
        SqlFile(@"Migrations\Sql\2013-08-15 FillTable.sql");
    }