c# DataDirectory的用法
笔者在使用EntityFramework中的Scaffolding机制自动创建拓展名为mdf的数据库及表单时,遇到如下的错误:
Afileactivationerroroccurred.
Thephysicalfilename'\\MusicDBContext.mdf'maybeincorrect.
Diagnoseandcorrectadditionalerrors,andretrytheoperation.
CREATEDATABASEfailed.Somefilenameslistedcouldnotbecreated.
Checkrelatederrors.
首先回顾一下创建这个程序的步骤:
1、创建一个Console控制台应用程序,程序集名称及命名空间为ConsoleApp;
2、使用程序包控制台管理器将EntityFramework包含到此程序中,代码如下:
PM>install-packageEntityFramework
3、在App.Config文件中将以下内容插入到configuration节点:
4、在控制台编写以下代码:
usingSystem;
usingSystem.Linq;
usingSystem.Data.Entity;
namespaceConsoleApp
{
classProgram
{
staticvoidMain(string[]args)
{
try
{
MusicDbContextdb=newMusicDbContext();
Musicmusic=newMusic{Title="FarAwayFromHome",
ReleaseDate=DateTime.Now};
db.Musics.Add(music);
db.SaveChanges();
db.Musics.ToList().ForEach(x=>Console.WriteLine($"{x.ID},
{x.Title},{x.ReleaseDate}"));
}
catch(Exceptionex)
{
Console.WriteLine(ex.Message);
if(ex.InnerException!=null)
{
Console.WriteLine(ex.InnerException.Message);
}
}
Console.ReadKey();
}
}
publicclassMusic
{
publicintID{get;set;}
publicstringTitle{get;set;}
publicDateTimeReleaseDate{set;get;}
}
publicclassMusicDbContext:DbContext
{
publicMusicDbContext():base("MusicDBContext"){}
publicDbSetMusics{set;get;}
}
}
5、运行此程序,发现程序不能按自己想要的结果运行,出现在最前面出现的错误。
通过查看出错的信息,发现
AttachDBFilename=|DataDirectory|\MusicDBContext.mdf
有问题,而这又是没有问题的,这到底是怎么回事?为什么会出现错误?
于是,通过MSDN查找相关资料,通过以下方法获得DataDirectory指定的路径是什么:
objectpath=AppDomain.CurrentDomain.GetData("DataDirectory");
运行此行代码,发现path居然是null!!!什么?一般控制台或者WindowsForm程序根据是Debug还是Release决定DataDirectory的初始化路径为Bebug文件夹还是Release文件夹吗?
这个错了。
如果原先的Bebug文件夹或Release文件夹存在数据库文件,使用类似"AttachDBFilename=|DataDirectory|\MusicDBContext.mdf"的写法是没有问题的,
即使path=null,它也知道是在Bebug文件夹或Release文件夹下。
如果原先的Bebug文件夹或Release文件夹不存在数据库文件,上面的写法就有问题,也就会出现最开始出现的那种错误。
那么,我们该如何解决呢?细心的人可以发现,既然可以使用AppDomain.CurrentDomain.GetData来获得DataDirectory指定的路径,
那及可以使用AppDomain.CurrentDomain.SetData来指定DataDirectory的初始化路径,代码如下:
AppDomain.CurrentDomain.SetData("DataDirectory",Environment.CurrentDirectory);
通过以上的方法,就可以解决最开始前面的问题。
通过以上的介绍,最终的代码修改如下:
usingSystem;
usingSystem.Linq;
usingSystem.IO;
usingSystem.Data.Entity;
namespaceConsoleApp
{
classProgram
{
staticvoidMain(string[]args)
{
stringdbPath=Environment.CurrentDirectory+@"\MusicDBContext.mdf";
if(!File.Exists(dbPath))
{
AppDomain.CurrentDomain.SetData("DataDirectory",Environment.CurrentDirectory);
}
try
{
MusicDbContextdb=newMusicDbContext();
Musicmusic=newMusic{Title="FarAwayFromHome",ReleaseDate=DateTime.Now};
db.Musics.Add(music);
db.SaveChanges();
db.Musics.ToList().ForEach(x=>Console.WriteLine($"{x.ID},{x.Title},{x.ReleaseDate}"));
}
catch(Exceptionex)
{
Console.WriteLine(ex.Message);
if(ex.InnerException!=null)
{
Console.WriteLine(ex.InnerException.Message);
}
}
Console.ReadKey();
}
}
publicclassMusic
{
publicintID{get;set;}
publicstringTitle{get;set;}
publicDateTimeReleaseDate{set;get;}
}
publicclassMusicDbContext:DbContext
{
publicMusicDbContext():base("MusicDBContext"){}
publicDbSetMusics{set;get;}
}
}
程序就可以正常运行了。
注:
1)AttachDBFilename=|DataDirectory|\MusicDBContext.mdf
其中的“\”可以省略掉,即为:AttachDBFilename=|DataDirectory|MusicDBContext.mdf
2)如果是ASP.NET程序,DataDirectory的初始化目录为App_Data。
3)关于更多的|DataDirectory|知识,请参考如下:
https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/ef/connection-strings
https://stackoverflow.com/questions/1409358/ado-net-datadirectory-where-is-this-documented/1409378#1409378
https://stackoverflow.com/questions/51948028/a-file-activation-error-occurred-when-using-entity-framework
以上就是c#DataDirectory的用法的详细内容,更多关于c#DataDirectory的资料请关注毛票票其它相关文章!