6

Perché filePath è nullo? Qualche idea su come ottenere il file filePath relativo?Entity Framework - Come ottenere il percorso del file relativo nel metodo seed

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

Ho il codice di cui sopra in un file nella cartella Configuration.cs migrazioni creata quando Entity Framework è impostato su un progetto ASP .NET MVC

Quando eseguo "Update-Database -Verbose" a pacchetto Console di gestione Ottengo un errore che filePath è nullo.

Se ho impostato manualmente filePath con un URL assoluto del file:

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

tutto funziona bene.

Ovviamente l'obiettivo è avere un percorso relativo per consentire il lavoro con diversi sviluppatori su diverse configurazioni.

A dire il vero tutto quello di cui ho bisogno è il file - non necessariamente il percorso. Qualsiasi aiuto sarà apprezzato.

+0

il percorso del file è nullo, o il 'System.Web.HttpContext.Current' e si dispone di un'eccezione? – Aristos

+0

Aristos, so che filePath è null (o System.Web.HttpContext.Current è). Quello che non so è perché, né un modo per ottenere il filePath nel metodo seed –

+0

Se non si conosce il valore null, probabilmente non si è riusciti a risolverlo. Penso che tu lo chiami non da una pagina e 'HttpContext' sia nullo e che il problema qui. Alla fine la tua domanda deve essere accurata e non lasciarci immaginare i problemi reali - ovviamente puoi seguire che solo tu cerchi soluzioni. – Aristos

risposta

20

Io uso questa funzione per mappare i percorsi all'interno del metodo dei semi, non molto pulito ma funziona:

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

poi basta chiamare utilizzando:

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

Sulla mia macchina di sviluppo, questo pone% 20s nel percorso, quindi se si hanno spazi nei nomi delle cartelle fallisce. –

+1

Tu sei una bella persona ... Mio Dio, ho guardato a destra e al centro per questo bloodpepfoefoisjk; gfiorjeogjersgio. GRAZIE! – Jimmyt1988

+1

@ Jimmyt1988 * blush * :) –

0

Come ho detto, I belive che tu lo chiami da una pagina e l'System.Web.HttpContext.Current è nullo, perché MapPath funzione di non tornare mai più nulla di un ingresso non nullo - in modo da ottenere un'eccezione lì.

Prova questa alternativa:

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

o

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

questione connessa: How to access the HttpServerUtility.MapPath method in a Thread or Timer?

Problemi correlati