问题
Why is filePath null? Any ideas on how to get the relative 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
}
}
I have the above code in Configuration.cs file in Migrations folder created when entity framework is set up on an ASP .NET MVC project
When I run "Update-Database -Verbose" in Package Manager Console I get an error that filePath is null.
If I manually set filePath with an absolute URL to the file:
string filePath = "C:/Users/User1/My Documents/Visual Studio 2012/Projects/MvcProject/Content/File.txt";
Everything works fine.
Obviously the goal is to have a relative path to enable work with different developers on different setups.
Truth be told all I need is the file - not necessarily the path. Any help will be appreciated.
回答1:
I use this function to map paths inside the Seed method, not very clean but it works:
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;
}
then just call it using:
using (var streamReader = new StreamReader(MapPath("~/Data/MyFile.csv")))
回答2:
As I say , I belive that you call it from a page and the System.Web.HttpContext.Current
is null, because MapPath
function never return null with a not null input - so you get an exception there.
Try that alternative:
string filePath = HttpRuntime.AppDomainAppPath + "/Content/File.txt";
or
string filePath = HostingEnvironment.MapPath("~/Content/File.txt");
Related question: How to access the HttpServerUtility.MapPath method in a Thread or Timer?
来源:https://stackoverflow.com/questions/16260975/entity-framework-how-to-get-relative-file-path-in-seed-method