簡體   English   中英

實體框架 - 如何在種子方法中獲取相對文件路徑

[英]Entity Framework - How to get relative file path in seed method

為什么filePath為null? 有關如何獲取相對filePath的任何想法?

internal sealed class Configuration : DbMigrationsConfiguration<MvcProject.Models.FileDb>
{
    public Configuration()
    {
        // code here is not relevant to question
    }
    protected override void Seed(MvcProject.Models.FileDb context)
    {    
        string filePath = System.Web.HttpContext.Current.Server.MapPath("~/Content/File.txt");

        // read File.txt using filePath and update the database
    }
}

我在ASP .NET MVC項目上設置實體框架時創建的Migrations文件夾中的Configuration.cs文件中有上述代碼

當我在包管理器控制台中運行“Update-Database -Verbose”時,我收到一個錯誤,即filePath為null。

如果我手動設置filePath與文件的絕對URL:

string filePath = "C:/Users/User1/My Documents/Visual Studio 2012/Projects/MvcProject/Content/File.txt";

一切正常。

顯然,目標是建立一個相對路徑,以便在不同的設置上與不同的開發人員一起工作。

真相被告知所有我需要的是文件 - 不一定是路徑。 任何幫助將不勝感激。

我用這個函數來映射Seed方法里面的路徑,不是很干凈但是它有效:

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

    var absolutePath = new Uri(Assembly.GetExecutingAssembly().CodeBase).LocalPath; //was AbsolutePath but didn't work with spaces according to comments
    var directoryName = Path.GetDirectoryName(absolutePath);
    var path = Path.Combine(directoryName, ".." + seedFile.TrimStart('~').Replace('/','\\'));

    return path;
}

然后使用以下方法調用它:

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

正如我所說的,我相信你從一個頁面調用它並且System.Web.HttpContext.Current為null,因為MapPath函數永遠不會返回帶有非null輸入的null - 所以你在那里得到一個例外。

嘗試替代方案:

string filePath = HttpRuntime.AppDomainAppPath + "/Content/File.txt";

要么

string filePath = HostingEnvironment.MapPath("~/Content/File.txt");

相關問題: 如何在線程或計時器中訪問HttpServerUtility.MapPath方法?

暫無
暫無

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

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