情報応用演習Ⅰ(2024)

【T2e】Entity Framework Core を用いたデータベースへのアクセス(5/6)

プロジェクトタイプC#コンソールアプリ※
プロジェクト名T2e
ソリューション名PIT2
ターゲットフレームワーク.NET 8.0(長期的なサポート)
最上位レベルのステートメントを使用しない使用する(チェックオフ)

※ 「コンソールアプリ(.NET Framework)」ではないので注意せよ!

注意
  • 本ページの作業内容は 前のページまでの続き になっていることに注意せよ.
    • 先に前のページまでをすべて読み,指示されている作業を済ませてから本ページを読むこと.
    • プロジェクトの作成作業についてはO/Rマッピングの必要性を参照せよ.

2e-5. Entity Framework Coreにおけるリレーションシップ

従業員に紐づく別のテーブルの情報の取得も試みてみよう. あるテーブルに外部キー制約などで紐づいているほかのテーブルの情報を取り出すには, ナビゲーションプロパティを利用する.

TblJugyoinクラスの定義を_に再掲する.

自動生成された従業員クラス(再掲)

強調した部分がナビゲーションプロパティである.これについてはここでは簡単に説明しておくにとどめ,詳細は後日詳しく説明することにする.

ナビゲーションプロパティは,あるテーブルが外部キーとして参照しているテーブルに対応するクラスの オブジェクトを「手繰り寄せる」ためのものである.

例えば,各従業員には直属の上司(kanrisha_no)が多くとも一人設定されている.この上司の情報を手繰り寄せるための プロパティがKanrishaNoNavigationプロパティである.逆に,自分自身が上司役となっている従業員たちのリストが InverseKanrishaNoNavigationプロパティである(_).

上司と部下たち

多重度によりこれらのプロパティの型も異なり,自分にとって相手が多なのであればICollection<T>型のプロパティに, 自分にとって相手が1なのであれば,そのまま相手の型のプロパティとなる. _に,従業員クラスのナビゲーションプロパティを,従業員データベースのER図のリレーションシップに照らし合わせたものを示す.

1

ナビゲーションプロパティとリレーションシップ

では,先ほどのプログラムに手を加えて,指定した従業員の上司と部下も表示するように変更してみよう. Program.cs を_に示すように変更する.

Program.csの内容
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
using Microsoft.EntityFrameworkCore;
using T2e;

// ① データコンテキストクラスのインスタンスの生成(データベースとの接続を開始)
var context = new SampleDbHrContext();

Console.Write("対象の従業員番号を入力: ");
int targetNo;
if (!int.TryParse(Console.ReadLine()?.Trim(), out targetNo)) Environment.Exit(1);

// ② クエリの生成(LINQを使う)
var result = (from j in context.TblJugyoins
             where j.JugyoinNo == targetNo
            select j)
            .Include(j => j.KanrishaNoNavigation)
            .Include(j => j.InverseKanrishaNoNavigation)
            .FirstOrDefault();

// ③ 結果の読み取り
if(result != null)
{
    Console.WriteLine($"jugyoin_no = {result.JugyoinNo}, sei = {result.Sei}, mei = {result.Mei}");
    Console.WriteLine($"     kyuyo = {result.Kyuyo,10}, shugyobi = {result.ShugyoBi:yyyy-MM-dd}");

    Console.Write("    上司: ");
    Console.WriteLine((result.KanrishaNoNavigation?.JugyoinNo.ToString() ?? "なし"));

    Console.Write("    部下: ");
    Console.WriteLine(result.InverseKanrishaNoNavigation.Count != 0 ?
            string.Join(", ", from buka in result.InverseKanrishaNoNavigation select buka.JugyoinNo) : "なし");
}//if

書き換えたら実行してみよう.実行すると従業員番号の入力を求められるので適当な従業員番号(例えば101)を入力して Enterキーを押す.実行結果は_のようになる.指定した従業員にくわえて,いる場合はその上司と部下の 従業員番号が表示されていることが分かる.

対象の従業員番号を入力: 101
jugyoin_no = 101, sei = 荒木, mei = 飛呂彦
     kyuyo =    1700000, shugyobi = 2001-09-21
    上司: 100
    部下: 106, 107, 108, 200, 203, 204, 205
実行結果

  1. ※ 従業員データベース上で従業員テーブル(tbl_jugyoin)が持っている列bumon_no,つまりその従業員が所属している部門へのナビゲーションプロパティが作られていないのは,データベース演習Ⅱの教程の都合上bumon_noに外部キー制約がつけられていないためである. ↩︎

Last updated on 2024-04-26
Published on 2024-04-26

Powered by Hugo. Theme by TechDoc. Designed by Thingsym.