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的资料请关注毛票票其它相关文章!