【问题标题】:Code first migrations: read sql from file代码优先迁移:从文件中读取 sql
【发布时间】:2011-10-30 19:23:23
【问题描述】:

我关注了来自 ADO.NET 团队 Code First Migrations 的帖子:Alpha 3 ‘No-Magic’ Walkthrough

我正在尝试使用 sql 读取文件以在 asp.net mvc Web 应用程序中进行迁移。我正在使用sql方法。问题是,无论我做什么,我都无法获得项目的根路径。我总是得到 'c:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\'

有人可以指点我打开文件的方法吗?

谢谢。

已编辑

public partial class AddMembership : DbMigration
{
    public override void Up()
    {
        //var file = File.OpenText(System.IO.Path.GetDirectoryName() + "Model/Schema/membership-up.sql");
        //var file = File.OpenText(AppDomain.CurrentDomain.BaseDirectory + "Model/Schema/membership-up.sql");
        //var path = HttpContext.Current.Request.MapPath("/Models/Schema/membership-up.sql");
        var path = HttpContext.Current.Server.MapPath("/Models/Schema/membership-up.sql");
        Sql(file.ReadToEnd());
    }

    public override void Down()
    {
        // ....
    }
}

【问题讨论】:

  • 嗨,marc_s,我发布了一些我尝试过的代码。
  • 好的,有两件事:(1) 这样做/Models 文件夹和.sql 文件真的存在于您部署的ASP.NET 站点中吗? (2):您很可能需要使用基于波浪号的映射:.MapPath("~/Models/Schema/membership-up.sql")
  • 嘿marc_s,感谢您的回复。是的,该文件夹存在但在我的开发项目中。我也试过'〜'。正如我在 jdross 回复中评论的那样,使用 MapPath 会引发异常。由于此代码是在包管理器控制台中调用的,我不确定我们是否可以抛出 HttpContext。
  • 如果您只指定整个完整路径,可能从配置文件或其他内容中读取,该怎么办?如果您在包管理器控制台中调用它,那应该可以工作(不需要 Server.MapPath)。
  • 我想过,但我希望有一个独立于我的项目路径的解决方案,因为此代码用于团队环境。我无法在 .NET API 中找到一些东西来获取我的项目路径,至少在没有抛出 System.NullReferenceException 的情况下。

标签: asp.net-mvc ef-code-first entity-framework-migrations


【解决方案1】:

【讨论】:

  • 您好,感谢您的回复。不幸的是,当我从包管理器控制台运行 Update-Database 时,HttpContext.Current.Server.MapPath 会引发异常。我也试过 HttpContext.Current.Request.MapPath 但我不认为这个控制台工具有 HttpContext。
【解决方案2】:

要直接从站点运行迁移,您可以添加此代码

var dbMigrator = new DbMigrator(new Settings());
dbMigrator.Update();

要从任一进程(IIS 与包管理器控制台)运行迁移,您可以先检查是否在使用 Server.MapPath 之前创建了 Server 对象,这样您就可以识别您是在 IIS 下还是在包管理器控制台下。 如果 Server 对象为 null,则您位于 Package Manager Console 下,因此您可以使用更合适的方法从 like 获取当前路径

Directory.GetCurrentDirectory();

所以我会替换这段代码

var path = HttpContext.Current.Server.MapPath("/Models/Schema/membership-up.sql");

类似这样的东西

String path;
if (HttpContext.Current.Server != null) {
    path = HttpContext.Current.Server.MapPath("/Models/Schema/membership-up.sql");
} else {
    path = Path.Combine(Directory.GetCurrentDirectory(), "Models/Schema/membership-up.sql");
}

【讨论】:

  • 嘿欧金尼奥。直到今天我才看到你已经回复了。问题是我想从包管理器控制台运行它,而我在开发环境中并且 HttpContext 上下文不存在。我得看看微软是否在测试版中为这种场景提供了一些东西。
猜你喜欢
  • 1970-01-01
  • 2016-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多