当記事は、ワテが独学でVisual Studioを使ってデータベースプログラミングに挑戦した備忘録の第七回目。
今回は、いよいよデータベースプログラミング醍醐味であるEntity Frameworkに挑戦だ。
では、本題に入ろう。
Entity Frameworkとは何か?
ワテの場合、全く知らない。
最初に、
を見ておけばよかった。
SQL Server についていろいろ調べていると Entity Framework という言葉をよく目にする。
ワテには初めて目にする言葉だ。
名前から判断して .NET Framework と何か関係ありそうだが、検索してみても今一つ良く分からない。
Entity Frameworkのサンプルコードを試す
取りあえず何かサンプルプロジェクトを実行してみてどんなもんなのか試してみたい。
検索して以下のサンプルプロジェクトを見つけた。
Entity Framework Tutorial for Beginners – CodeProject
CodeProject には沢山の良いサンプルプロジェクトがあり、ダウンロードして解凍するとVisual Studio で直ぐに開ける形式のものが多いので、ユーザー登録をお勧めしたい。
さて、ダウンロードしたファイルを解凍すると、
こんな感じ。
この sln ファイルを Visual Studio で開く。10 という数字があるので Visual Studio 2010 で作ったプロジェクトで有る事が分かる。
Visual Studio 2013 でも問題なく開けるのでダブルクリックする。
VS2010 のプロジェクトなので VS2013 への変換処理が自動で行われ、その結果が表示された。
エラーは無いが、警告が合計3個出ている。
まあ、経験的には、これくらいの数の警告は良く出るので気にしなくてもこのままビルドすると大抵の場合動く事が多い。
兎に角サンプルコードをリビルドしてみた
正常終了した。
で、実行してみた。
リビルド出来たので実行してみた
全然あかんがな。
実行時エラーの原因を解明する
こういう場合は、急がずに、先ほどのCodeProjectのページの説明をじっくり見てみる。
そうしたら、
1. Start a New Project
Start a new “ASP.NET Web Application”
で新規にプロジェクトを作るところから解説してある。でも、それだと面倒なのでその部分はスキップして次に行く。
つぎはデータベースを作成するようだ。
2. Create Database
LearnEF という名前のデータベースを作成するようだ。
このDBはEmployee という名前のテーブルを一個だけ持っている。
Employee の中にはいくつかの基本的な情報を持っている。
で、いったいどうすればそんなDBが作れるのかなと思ったのだが、以下のscriptを実行すると良いと書いてある。
その部分を引用させて頂くと、こんな感じ。
CREATE TABLE Employee ( EmpId int NOT NULL IDENTITY(1,1) PRIMARY KEY, HREmpId nvarchar(10), FirstName nvarchar(30), LastName nvarchar(30), Address nvarchar(30), City nvarchar(30) ) GO --SearchEmployee '', '' CREATE PROCEDURE SearchEmployee ( @FirstName varchar(30), @City varchar(30) ) AS BEGIN DECLARE @query nvarchar(1000) SET @query = 'SELECT * FROM Employee e' SET @query = @query + ' WHERE 1=1' IF @FirstName != '' SET @query = @query + ' AND FirstName LIKE ''' + @FirstName + '%''' IF @City != '' SET @query = @query + ' AND City LIKE ''' + @City + '%''' EXEC (@query) END GO
で、これをどこで実行すればいいのか少し考えたら、先日インストールした、SQL Server Management Studioで出来るんちゃうかと思ったので開いてみた。
SQL Server Management Studioでテーブルを作成する
直感で、新しいクエリというのを開いて、その中に、このスクリプトを貼り付けて、
実行してみた。
そうしたら、システムデータベースの中の master の中に dbo.Employee というのが出来たぞ。
それと、プログラミングと言う項目の中に dbo.SearchEmployee というのが出来た。
これでいいのか?
中身を見てみると、それらしい感じで出来ている。
で、リビルドして実行してみたら、同じエラー。
再びリビルドして実行したら同じエラー
あかんがな。
で、またまた直感で、
LearnEF.edmx
をクリックして、開いたEmployeeという文字の青色の部分で右クリックして、
データベースからモデルを更新
を実行してみた。
更新ウィザードを実行
更新ウィザードと言うのが出たので [新しい接続] をクリック
[次へ] をクリック
サーバー名とデータベース名(master)を選択してみた。
テスト接続をしたら成功。
[OK] をクリックすると
データ接続の選択と言う画面になったので [次へ] をクリック
ようやく Entity Framework というのが出てきたが5.0は古いらしい。
ここは指示通り中断して 6.x に上げてみたいので [キャンセル] をクリック。
NugetでEntityFrameworkをインストールする
Entity Frameworkのアップデートで検索したところ、
のサイトの説明では、
To install EntityFramework, run the following command in the Package Manager Console
PM> Install-Package EntityFramework
と書いてあるので、早速実行してみた。下図。
上図のように実行すると、下図のように、いい感じで Entity Framework 6.1.3 に上がったようだ。
参照設定のところを確認すると、追加されているようだ。
で、ビルドしてみたら、まだエラーが出る。
ここで諦めるわけには行かないのでCodeProjectのページをじっくり読んでみた。
そうしたら、CodeProjectのページの末尾にあるComments and Discussions のところを見ると、
Error while executing code
Entity Framework Tutorial for BeginnersA simple tutorial for beginners to learn the basics of Entity Framework. It will teach you how to perform CRUD operation...This issue is due to the difference in Entity Framework version used in this article and the one you are using. The article is written using Visual Studio 2010 and EF4. You are using EF5 or EF6. In EF4, the database context is created as an ObjectContext but in EF5 (and EF6) the database context is the new type DBContext. To fix this issue:
Instead of AddObject, use the the Add method. Use the Remove method instead of DeleteObject. I hope this would help you.
と書いてあるので早速、以下に示す該当箇所を二ヶ所修正した。
protected void btnSave_Click(object sender, EventArgs e) { Int32 empId = Convert.ToInt32(btnSave.CommandArgument); if (empId == 0) { //INSERT LearnEFEntities db = new LearnEFEntities(); Employee objEmp = new Employee(); objEmp.HREmpId = txtHREmpId.Text; objEmp.FirstName = txtFirstName.Text; objEmp.LastName = txtLastName.Text; objEmp.Address = txtAddress.Text; objEmp.City = txtCity.Text; // db.Employees.AddObject(objEmp); // 変更前 db.Employees.Add(objEmp); // 変更後 db.SaveChanges();
protected void btnDelete_Click(object sender, EventArgs e) { Int32 empId = Convert.ToInt32(btnSave.CommandArgument); if (empId != 0) { LearnEFEntities db = new LearnEFEntities(); Employee objEmp = new Employee() { EmpId = empId }; db.Employees.Attach(objEmp); // db.Employees.DeleteObject(objEmp); // 変更前 db.Employees.Remove(objEmp); // 変更後 db.SaveChanges();
さらに、参照が一個足らないようだったので追加した。
System.Data.Entry
これで、再度リビルドして実行すると、無事にサンプルコードを動かす事が出来た。
ようやくサンプルコードが動いた!
適当に名前を入れて Save してみるとデータが追加出来たようだ。
Update や Delete も出来る。
と言う事で、まあ、良く分からないが Entity Framework 6.1.3 というのを使って SQL Server 2014 Express のデータベースのテーブルにデータを読み書きする C# のサンプルが出来た。
これを応用すれば、何でも作れるぞ!
まとめ
ワテの場合、データベースプログラミングは初めての経験であったが、上記のようにネットで見付けたEntity Frameworkのサンプルコードを無事に実行する事が出来た。
つづく
コメント