9

filePath が null なのはなぜですか? 相対ファイルパスを取得する方法についてのアイデアはありますか?

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 であるというエラーが表示されます。

ファイルへの絶対 URL を使用して filePath を手動で設定した場合:

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

すべて正常に動作します。

明らかに、目標は、さまざまな開発者がさまざまなセットアップで作業できるようにするための相対パスを用意することです。

正直なところ、必要なのはファイルだけです。必ずしもパスではありません。どんな助けでも大歓迎です。

4

2 に答える 2

25

この関数を使用して 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")))
于 2013-11-19T11:35:26.087 に答える