EntityFramwork -> 実践

Posted by muchag | C#,Visual Studio |
初回投稿:2018-01-21 (日) 20:14:57 | 最終更新:2018-01-25 (木) 22:58:45

お試し で大分理解できたので
実際に挑戦!

【環境】
Visual C#: 15.5.4(2017)
プロジェクト作成

お試し との変更点は
メインをフォームアプリにしたこと。

参照設定

フォームアプリプロジェクトへ、NuGet パッケージ管理から、下記をインストール。

  • SQLitePCLRaw.bundle_e_sqlite3
  • SQLitePCLRaw.bundle_sqlcipher
  • SQLitePCLRaw.bundle_green
スタートアッププロジェクト

上記3つのプロジェクトについて、何をするかによって
スタートアッププロジェクトを切り替えないければならない。

  • フォームプロジェクト
    • フォームアプリを動かすときは、これがスタートアッププロジェクト
  • ビジネスロジックプロジェクト
    • マイグレーションをするときは、これがスタートアッププロジェクト
  • ビジネスロジックテストプロジェクト
    • テストをするときは、これがスタートアッププロジェクト
初回マイグレーション
エラー1

Add-Migration Initial
More than one DbContext was found. Specify which one to use. Use the '-Context' parameter for PowerShell commands and the '--context' parameter for dotnet commands.
原因

DbContext クラスが複数あったため。

解決

対象 DbContext クラスを指定してコマンド実行。


Add-Migration Initial -Context MyAppSystem.EmployeeModel
To undo this action, use Remove-Migration.
Update-Database -Context MyAppSystem.EmployeeModel
Applying migration '20180121111141_Initial'.
Done.
エラー2

Add-Migration Initial -Context MyAppSystem.EmployeeModel
Could not load assembly 'MyApp'. Ensure it is referenced by the startup project 'MyAppSystem'.
原因

パッケージ マネージャー コンソール上部にある
「既定のプロジェクト」が、MyApp になっていた。

解決

「既定のプロジェクト」を、MyAppSystem に変更。

フォームイベント

今回は、フォームロード時に走らせる処理として Main_Load メソッドとした。
Main の部分は、フォームクラス名を入れるのが通例らしい。

フォームプロパティのイベント一覧(雷マーク)において
Load => Main_Load
と設定するだけ。

射影

Entity の中から、特定のプロパティを取得する=表示カラムを絞る。
このことを「射影」というらしい。


var arrayEmployees = db.Employees
    .Select(record => new {
        record.EmployeeCode,
        Name = record.FamilyName + " " + record.FirstName
    })
    .ToArray();
  • record へ新しい配列をセットするよ~
  • 配列のプロパティは、record.EmployeeCode と Name だよ~
  • record.EmployeeCode はそのままでいいけど、Name は、record の FamilyName と FirstName を半角スペースで連結して戻してね~

という風に、計算や加工も含めて自由に取得できる。

record

この部分の表記方法を勉強中。

LINQ の考え方としては「配列の要素」を指していると思う。

foreach (var value in array) の value に当たる感じ?

今回は、DB から抽出したレコード群が要素なので
record としてみたけど、何でもよさそう。

Count()

データの個数。


db.Employees.Count()
カラム名指定

上記例に合わせると、こうなる。


dgvEmployees.Columns[nameof(Employee.EmployeeCode)].HeaderText = "従業員コード";
dgvEmployees.Columns[nameof(Name)].HeaderText = "氏名";

ここで面白いのが
Employee.EmployeeCode を EmployeeCode とするとエラー。
record.EmployeeCode としてもエラー。
Name は、何も付けなくてもエラーにならないどころか、想定通りに動く。

まだまだ意味がわかっていない。

参考サイト

Qiita:Entity Framework6で単純なデータ表示フォームを作成(2015-09-08)
→DataGridView へのデータの登録の仕方。DataGridView のカラム名の変更の仕方

Keibalight プログラミングを淡々と:【LINQ】要素の個数を取得するには(Count集計演算子)(2011-07-19)
→LINQ による、データ個数の数え方

Posted by muchag | C#,Visual Studio |
初回投稿:2018-01-21 (日) 20:14:57 | 最終更新:2018-01-25 (木) 22:58:45

コメントはまだありません »

No comments yet.

RSS feed for comments on this post. TrackBack URI

Leave a comment