cci Data Directoryの使い方
6139 ワード
筆者はEntity FraamewarkにおけるScaffolding機構を使って自動的にmdfという拡張データベースとフォームを作成する時、次のようなエラーが発生しました。
A file activation error occurred.
The physical file name'\Music DBContact.mdf'may be incorect.
ディagnose and corect additional errors,and retry the operation.
CREATE DATABASE failed.Some file names listed could not be created.
Check related errors.
まずこのプログラムを作成する手順を振り返ってみます。
1、Consolieコンソールアプリケーションを作成し、プログラム名と名前空間はConsolipとする。
2、プログラムパッケージコンソールマネージャを使ってEntity Fraamewarkをこのプログラムに含めると、コードは以下の通りです。
エラーメッセージを表示することで、発見しました。
Attach DB Filename=|Data Directory\Music DBControtext.mdf
問題がありますが、これは大丈夫です。これは一体どういうことですか?なぜエラーが発生しましたか?
したがって、MSDNによって関連資料を検索し、Data Directoryによって指定された経路は何かを得る。
これは間違っています。
元のBebugフォルダやReleaseフォルダにデータベースファイルが存在していたら、「AttachDB Filename=|Data Directory|\Music DBControtext.mdf」と似た書き方をすれば大丈夫です。
path=nullであっても、BebugフォルダまたはReleaseフォルダの下にあることが分かります。
元のBebugフォルダやReleaseフォルダにデータベースファイルが存在しないと、上の書き方に問題があります。最初に発生したエラーもあります。
じゃ、私たちはどう解決しますか?注意深い人は、App Domain.Current Domain.GetDataを使用してData Directoryの指定されたパスを取得することができます。
アプリDomain.Current Domain.SetDataを使ってData Directoryの初期化経路を指定できます。コードは以下の通りです。
以上の紹介を通して、最終コードは下記のように修正されました。
注:
1)AttachDB Filename=|Data Directory\Music DBContect.mdf
その中の「\」は省略できます。つまり、AttachDB Filename=|Data Directory|Music DBControtext.mdfです。
2)ASP.NETプログラムであれば、Data Directoryの初期化ディレクトリはApp_Data
3)詳細については、下記を参照してください。
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芬Data Directoryの使い方の詳細です。c菗Data Directoryに関する資料は他の関連記事に注目してください。
A file activation error occurred.
The physical file name'\Music DBContact.mdf'may be incorect.
ディagnose and corect additional errors,and retry the operation.
CREATE DATABASE failed.Some file names listed could not be created.
Check related errors.
まずこのプログラムを作成する手順を振り返ってみます。
1、Consolieコンソールアプリケーションを作成し、プログラム名と名前空間はConsolipとする。
2、プログラムパッケージコンソールマネージャを使ってEntity Fraamewarkをこのプログラムに含めると、コードは以下の通りです。
PM> install-package Entity Framework
3、App.Cofigrationノードに以下の内容を挿入する:
<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、コンソールで以下のコードを作成する:
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、このプログラムを実行すると、プログラムは自分の思った通りに実行できなくなり、一番前に発生したエラーが発生しました。エラーメッセージを表示することで、発見しました。
Attach DB Filename=|Data Directory\Music DBControtext.mdf
問題がありますが、これは大丈夫です。これは一体どういうことですか?なぜエラーが発生しましたか?
したがって、MSDNによって関連資料を検索し、Data Directoryによって指定された経路は何かを得る。
object path = AppDomain.CurrentDomain.GetData("DataDirectory");
この行のコードを実行したら、パスがnullだったことが分かりました。なんですか?一般的なコンソールまたはWindows Formプログラムは、Debugですか?それともReleaseですか?Data Directoryの初期化経路はBebugフォルダですか?それともReleaseフォルダですか?これは間違っています。
元のBebugフォルダやReleaseフォルダにデータベースファイルが存在していたら、「AttachDB Filename=|Data Directory|\Music DBControtext.mdf」と似た書き方をすれば大丈夫です。
path=nullであっても、BebugフォルダまたはReleaseフォルダの下にあることが分かります。
元のBebugフォルダやReleaseフォルダにデータベースファイルが存在しないと、上の書き方に問題があります。最初に発生したエラーもあります。
じゃ、私たちはどう解決しますか?注意深い人は、App Domain.Current Domain.GetDataを使用してData Directoryの指定されたパスを取得することができます。
アプリDomain.Current Domain.SetDataを使ってData Directoryの初期化経路を指定できます。コードは以下の通りです。
AppDomain.CurrentDomain.SetData("DataDirectory", Environment.CurrentDirectory);
以上の方法で、最初の問題を解決できます。以上の紹介を通して、最終コードは下記のように修正されました。
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; }
}
}
プログラムは正常に動作します。注:
1)AttachDB Filename=|Data Directory\Music DBContect.mdf
その中の「\」は省略できます。つまり、AttachDB Filename=|Data Directory|Music DBControtext.mdfです。
2)ASP.NETプログラムであれば、Data Directoryの初期化ディレクトリはApp_Data
3)詳細については、下記を参照してください。
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芬Data Directoryの使い方の詳細です。c菗Data Directoryに関する資料は他の関連記事に注目してください。