c# DataDirectory的用法
筆者在使用Entity Framework中的Scaffolding機(jī)制自動(dòng)創(chuàng)建拓展名為mdf的數(shù)據(jù)庫(kù)及表單時(shí),遇到如下的錯(cuò)誤:
A file activation error occurred.
The physical file name '\\MusicDBContext.mdf' may be incorrect.
Diagnose and correct additional errors, and retry the operation.
CREATE DATABASE failed. Some file names listed could not be created.
Check related errors.
首先回顧一下創(chuàng)建這個(gè)程序的步驟:
1、創(chuàng)建一個(gè)Console控制臺(tái)應(yīng)用程序,程序集名稱及命名空間為ConsoleApp;
2、使用程序包控制臺(tái)管理器將Entity Framework包含到此程序中,代碼如下:
PM> install-package Entity Framework
3、在App.Config文件中將以下內(nèi)容插入到configuration節(jié)點(diǎn):
<connectionStrings>
<add name="MusicDBContext"
connectionString="Data Source=(LocalDb)\MSSQLLocalDB;
Initial Catalog=MusicDBContext;Integrated Security=SSPI;
AttachDBFilename=|DataDirectory|\MusicDBContext.mdf"
providerName="System.Data.SqlClient" />
</connectionStrings>
4、在控制臺(tái)編寫(xiě)以下代碼:
using System;
using System.Linq;
using System.Data.Entity;
namespace ConsoleApp
{
class Program
{
static void Main(string[] args)
{
try
{
MusicDbContext db = new MusicDbContext();
Music music = new Music { Title = "Far Away From Home",
ReleaseDate = DateTime.Now };
db.Musics.Add(music);
db.SaveChanges();
db.Musics.ToList().ForEach(x => Console.WriteLine($"{x.ID},
{x.Title},{x.ReleaseDate}"));
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
if(ex.InnerException != null)
{
Console.WriteLine(ex.InnerException.Message);
}
}
Console.ReadKey();
}
}
public class Music
{
public int ID { get; set; }
public string Title { get; set; }
public DateTime ReleaseDate { set; get; }
}
public class MusicDbContext : DbContext
{
public MusicDbContext() : base("MusicDBContext") { }
public DbSet<Music> Musics { set; get; }
}
}
5、運(yùn)行此程序,發(fā)現(xiàn)程序不能按自己想要的結(jié)果運(yùn)行,出現(xiàn)在最前面出現(xiàn)的錯(cuò)誤。
通過(guò)查看出錯(cuò)的信息,發(fā)現(xiàn)
AttachDBFilename=|DataDirectory|\MusicDBContext.mdf
有問(wèn)題,而這又是沒(méi)有問(wèn)題的,這到底是怎么回事?為什么會(huì)出現(xiàn)錯(cuò)誤?
于是,通過(guò)MSDN查找相關(guān)資料,通過(guò)以下方法獲得DataDirectory指定的路徑是什么:
object path = AppDomain.CurrentDomain.GetData("DataDirectory");
運(yùn)行此行代碼,發(fā)現(xiàn)path居然是null?。?!什么?一般控制臺(tái)或者Windows Form程序根據(jù)是Debug還是Release決定DataDirectory的初始化路徑為Bebug文件夾還是Release文件夾嗎?
這個(gè)錯(cuò)了。
如果原先的Bebug文件夾或Release文件夾存在數(shù)據(jù)庫(kù)文件,使用類似"AttachDBFilename=|DataDirectory|\MusicDBContext.mdf"的寫(xiě)法是沒(méi)有問(wèn)題的,
即使path = null,它也知道是在Bebug文件夾或Release文件夾下。
如果原先的Bebug文件夾或Release文件夾不存在數(shù)據(jù)庫(kù)文件,上面的寫(xiě)法就有問(wèn)題,也就會(huì)出現(xiàn)最開(kāi)始出現(xiàn)的那種錯(cuò)誤。
那么,我們?cè)撊绾谓鉀Q呢?細(xì)心的人可以發(fā)現(xiàn),既然可以使用AppDomain.CurrentDomain.GetData來(lái)獲得DataDirectory指定的路徑,
那及可以使用AppDomain.CurrentDomain.SetData來(lái)指定DataDirectory的初始化路徑,代碼如下:
AppDomain.CurrentDomain.SetData("DataDirectory", Environment.CurrentDirectory);
通過(guò)以上的方法,就可以解決最開(kāi)始前面的問(wèn)題。
通過(guò)以上的介紹,最終的代碼修改如下:
using System;
using System.Linq;
using System.IO;
using System.Data.Entity;
namespace ConsoleApp
{
class Program
{
static void Main(string[] args)
{
string dbPath = Environment.CurrentDirectory + @"\MusicDBContext.mdf";
if(!File.Exists(dbPath))
{
AppDomain.CurrentDomain.SetData("DataDirectory", Environment.CurrentDirectory);
}
try
{
MusicDbContext db = new MusicDbContext();
Music music = new Music { Title = "Far Away From Home", ReleaseDate = DateTime.Now };
db.Musics.Add(music);
db.SaveChanges();
db.Musics.ToList().ForEach(x => Console.WriteLine($"{x.ID},{x.Title},{x.ReleaseDate}"));
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
if(ex.InnerException != null)
{
Console.WriteLine(ex.InnerException.Message);
}
}
Console.ReadKey();
}
}
public class Music
{
public int ID { get; set; }
public string Title { get; set; }
public DateTime ReleaseDate { set; get; }
}
public class MusicDbContext : DbContext
{
public MusicDbContext() : base("MusicDBContext") { }
public DbSet<Music> Musics { set; get; }
}
}
程序就可以正常運(yùn)行了。
注:
1)AttachDBFilename=|DataDirectory|\MusicDBContext.mdf
其中的“\”可以省略掉,即為:AttachDBFilename=|DataDirectory|MusicDBContext.mdf
2)如果是ASP.NET程序,DataDirectory的初始化目錄為App_Data。
3)關(guān)于更多的|DataDirectory|知識(shí),請(qǐng)參考如下:
https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/ef/connection-strings
以上就是c# DataDirectory的用法的詳細(xì)內(nèi)容,更多關(guān)于c# DataDirectory的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C# 類型轉(zhuǎn)換(隱式類型,顯式類型,自定義類型)
本文詳細(xì)介紹了C#中的類型轉(zhuǎn)換,包括隱式類型轉(zhuǎn)換和顯式類型轉(zhuǎn)換(強(qiáng)制類型轉(zhuǎn)換),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-11-11
C# 委托中 Invoke/BeginInvoke/EndInvoke和DynamicInvoke&
在C#中,委托(Delegate)提供了多種調(diào)用方式,包括 Invoke、BeginInvoke、EndInvoke 和 DynamicInvoke,每種調(diào)用方式都有其特定的用途和適用場(chǎng)景,下面將詳細(xì)介紹這些方法的區(qū)別與聯(lián)系,感興趣的朋友一起看看吧2025-03-03
c# 抓取Web網(wǎng)頁(yè)數(shù)據(jù)分析
通過(guò)程序自動(dòng)的讀取其它網(wǎng)站網(wǎng)頁(yè)顯示的信息,類似于爬蟲(chóng)程序。比方說(shuō)我們有一個(gè)系統(tǒng),要提取BaiDu網(wǎng)站上歌曲搜索排名。分析系統(tǒng)在根據(jù)得到的數(shù)據(jù)進(jìn)行數(shù)據(jù)分析。為業(yè)務(wù)提供參考數(shù)據(jù)。2008-11-11
深入理解C# abstract和virtual關(guān)鍵字
深入理解C# abstract和virtual關(guān)鍵字,學(xué)習(xí)c#的朋友可以參考下。2011-06-06
C# 實(shí)現(xiàn)Distinct將對(duì)象按條件去重
這篇文章主要介紹了C# 實(shí)現(xiàn)Distinct將對(duì)象按條件去重,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12

