Entity Framework – Cómo obtener una ruta de archivo relativa en el método semilla

¿Por qué es filePath nulo? ¿Alguna idea sobre cómo obtener el filePath relativo?

internal sealed class Configuration : DbMigrationsConfiguration { 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 } } 

Tengo el código anterior en el archivo Configuration.cs en la carpeta Migraciones creado cuando el marco de la entidad se configura en un proyecto ASP .NET MVC

Cuando ejecuto “Update-Database -Verbose” en la Consola del Administrador de paquetes, aparece un error que filePath es nulo.

Si configuro manualmente filePath con una URL absoluta para el archivo:

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

Todo funciona bien.

Obviamente, el objective es tener una ruta relativa para permitir el trabajo con diferentes desarrolladores en diferentes configuraciones.

A decir verdad, todo lo que necesito es el archivo, no necesariamente la ruta. Cualquier ayuda será apreciada.

Utilizo esta función para asignar rutas dentro del método Seed, no muy limpio pero funciona:

 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; } 

entonces solo llámalo usando:

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

Como dije, creo que lo llamas desde una página y System.Web.HttpContext.Current es nulo, porque la función MapPath nunca devuelve un valor nulo con una entrada no nula, por lo que obtienes una excepción allí.

Prueba esa alternativa:

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

o

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

Pregunta relacionada: ¿Cómo acceder al método HttpServerUtility.MapPath en un Thread o Timer?