簡體   English   中英

如何在沒有HttpContext的情況下在Entity Framework Seed方法中獲取文件路徑(從程序包管理器命令執行)

[英]How to get file path in Entity Framework Seed method without HttpContext (executed from package manager command)

在我的實體框架Seed方法中,我有以下代碼行可以從其他項目中獲取文件:

 var filePath = new DirectoryInfo(HostingEnvironment.ApplicationPhysicalPath).Parent.FullName + "\\Com.ProjectX\\companies.xls";

這在HttpContext可用時有效,例如使用以下操作方法觸發它時:

public ActionResult About()
    {
        var configuration = new Com.EntityModel.Configuration();
        var migrator = new System.Data.Entity.Migrations.DbMigrator(configuration);
        migrator.Update();

        return View();
    }

但是,當我從程序包管理器控制台執行Update-Database時,它不起作用(找不到文件,並且很難調試,因為這樣做時我也無法斷點。

我希望能夠使用Update-Database命令並使它在沒有HttpContext的情況下工作。 我怎么走?

我使用此函數來映射Seed方法內部的路徑,雖然不是很干凈,但是可以工作:

private string MapPath(string seedFile)
{
    if(HttpContext.Current!=null)
        return HostingEnvironment.MapPath(seedFile);

    var absolutePath = new Uri(Assembly.GetExecutingAssembly().CodeBase).AbsolutePath;
    var directoryName = Path.GetDirectoryName(absolutePath);
    var path = Path.Combine(directoryName, ".." + seedFile.TrimStart('~').Replace('/','\\'));

    return path;
}

然后使用以下命令調用它:

        using (var streamReader = new StreamReader(MapPath("~/Data/MyFile.csv")))

此外,要調試Seed方法,我只想對要顯示的消息拋出Exception(我是EF的初學者,我還沒有弄清楚如何寫到NuGet程序包管理器控制台:))

private string GetPath(string relativeFilePath)
{
    var absolutePath = new Uri(Assembly.GetExecutingAssembly().CodeBase).AbsolutePath;
    var directoryName = Path.GetDirectoryName(absolutePath);
    var path = Path.Combine(directoryName, ".." + relativeFilePath.TrimStart('~').Replace('/', '\\'));

    return System.Web.HttpUtility.UrlDecode(path); // decode spaces in path :(
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM