【问题标题】:Entity Framework migration: access sql file within ASP.NET实体框架迁移:在 ASP.NET 中访问 sql 文件
【发布时间】:2017-01-01 17:23:58
【问题描述】:

我有一个 ASP.NET Web API 项目。我正在使用实体框架迁移。目前,我有一个要在迁移期间执行的自定义脚本。我为此使用 SqlFile 方法:

SqlFile(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"Migrations/Scripts/MyCustomScript.sql"));

如果我将脚本的“复制到输出目录”设置为“始终复制”,这在集成测试中可以正常工作。

但是,在运行网站时,脚本被复制到<websiteroot>\bin\Migrations\MyCustomScript.sql,而AppDomain.CurrentDomain.BaseDirectory 指向网站根目录。因此,会抛出一个错误,指出无法找到该脚本:它位于 bin 文件夹中,而不是根目录中。

如何加载脚本以便在测试和实际网站中都能正常工作?

【问题讨论】:

    标签: asp.net entity-framework entity-framework-migrations


    【解决方案1】:

    我会将脚本包含在您的 dll 中,然后直接从 dll 加载脚本。比您不需要任何 if 语句,并且您始终知道您包含正确的脚本。将构建操作设置为嵌入式资源。然后你可以得到这样的脚本:

    Assembly assembly = Assembly.LoadFile(dll);
    using (Stream stream = assembly.GetManifestResourceStream(resourcepath))
    using (StreamReader reader = new StreamReader(stream))
    {
        string script = reader.ReadToEnd();
    

    【讨论】:

    • 我已经做到了:Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName) 并关闭括号,否则:很好的解决方案!
    • 很好,这取决于您嵌入文件的位置。很好,这对你有帮助!
    【解决方案2】:

    我会这样解决(这不是最好的方法,但它是一种方法)

    string sqlfilepath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"Migrations/Scripts/MyCustomScript.sql");
    if (!File.Exists(sqlfilepath))
        sqlfilepath = "your other path where it might exist";
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-19
      • 1970-01-01
      • 2015-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多