■内容
MVC5データベースファーストにて、既存DBのテーブル値関数からモデルを自動生成する。
テーブルやビューからは普通に出来るが、既存の「テーブル値関数」を利用する場合。
■解決方法
※スキャフォールディングによるビューの自動生成方法は、現時点で未確認。
1.あらかじめ「データ接続」を作成しておく
・「サーバーエクスプローラ」を開く
・「データ接続」を右クリック→「接続の追加」をクリック
・「データソース」デフォルト(Microsoft SQL Server (SqlClient))
・「サーバー名」を入力(または▼にて一覧から選択)
・「サーバーへのログオン」をそれなりに指定
・「データベースへの接続」▼にて使用するDBを選択
・[OK]ボタンクリック
2.「ソリューションエクスプローラ」
・「Models」フォルダ→右クリック→「追加」→「新しい項目」の順に選択
3.「新しい画面の追加」ウィンドウ
・左列で「データ」を選択
・中央のテンプレート一覧から「ADO.NET Entyty Data Model」を選択
・下部の名前覧を入力(DB名にすると解りやすい)
・[追加]ボタンクリック
4.「モデルコンテンツの選択」ウィンドウ
・「データベースから EF Dssiner」を選択し、[次へ]ボタンクリック
5.「データ接続の選択」ウィンドウ
・データ接続名はデフォルト(1.で設定した内容)
・問題ないようであれば「○はい、重要情報を接続文字列に含めます。」を選択
・「接続設定に名前を付けて Web.Config に保存」をチェック(デフォルトのまま)
・「接続設定名」→デフォルトのまま(DB名+'Entity' となる)
・[次へ]ボタンクリック
6.「データベースオブジェクトと設定の選択」ウィンドウ
・「ストアドプロシージャと関数」の左端△をクリックして開く
・「dbo」を開く
・一覧の中から該当の「テーブル値関数」をチェック
・「生成されたオブジェクト~」デフォルト(未チェック):チェックしても良い
・「モデルに外部キー列を含める」デフォルト(チェック)
・「選択したストアドプロシージャ~」デフォルト(チェック):必須
・[完了]ボタンクリック
・「セキュリティ警告」が表示されたら、内容を確認して[OK]ボタンクリック
・「ソリューションエクスプローラ」の「Models」フォルダの下に「○○.edmx」が生成される。
※テーブルなどの追加や、既存DBに変更が発生した場合の取り込み直しは、
「6.MVC5 テーブル値関数の再取り込み方法」を参照
※もし「○○.edmx」を作り直したい場合には、「○○.edmx」を右クリック→削除
した後で、「Web.Config」を開いて
<connectionStrings>セクションの
<add name="○○Entities" ~ の行を削除しないと、
接続名に「○○Entity1」のように連番が振られる。
7.内容の確認
・「ソリューションエクスプローラ」の上部にある「すべてのファイルを表示」アイコンをクリック。
・「○○.edmx」→「○○.tt」の順に開くと、「○○○_Result.cs」のように、テーブル値関数の
1レコード分のモデルクラスが自動生成されている。
・また「○○.edmx」→「○○.Context.tt」の順に開くと、「○○.Context.cs」として、
テーブル値関数を呼んで、テーブル値を取得するファンクションが自動生成されている。
<pre>
◆元になるテーブル値関数
ALTER FUNCTION [dbo].[売上入金速報]
(
@当日 DATE,
@累計開始日 DATE,
@累計終了日 DATE,
@社員番号 NUMERIC(5, 0)
)
RETURNS @tbl TABLE
(
データ区分 INT, -- 0:店舗明細、1:グループ合計、2:総合計
グループ番号 NUMERIC( 3, 0),
店舗番号 NUMERIC( 5, 0),
店舗名 VARCHAR(20),
当日売上合計 NUMERIC(18, 0), -- 税抜
累計売上合計 NUMERIC(18, 0), -- 税抜
当日入金合計 NUMERIC(18, 0), -- 税込
累計入金合計 NUMERIC(18, 0), -- 税込
売上目標合計 NUMERIC(18, 0), -- 税抜
売上達成率 NUMERIC( 3, 0), -- 税抜比率
入金達成率 NUMERIC( 3, 0) -- 税抜比率
)
AS ...
◆自動生成された呼び出しファンクション
[DbFunction("業務DBEntities", "売上入金速報")]
public virtual IQueryable売上入金速報_Result> 売上入金速報(
NullableSystem.DateTime> 当日, NullableSystem.DateTime> 累計開始日,
NullableSystem.DateTime> 累計終了日, Nullabledecimal> 社員番号)
{
var 当日Parameter = 当日.HasValue ?
new ObjectParameter("当日", 当日) :
new ObjectParameter("当日", typeof(System.DateTime));
...
return ((IObjectContextAdapter)this).ObjectContext.CreateQuery売上入金速報_Result>(
"[業務DBEntities].[売上入金速報](@当日, @累計開始日, @累計終了日, @社員番号)",
当日Parameter, 累計開始日Parameter, 累計終了日Parameter, 社員番号Parameter);
}
◆自動生成されたモデル
public partial class 売上入金速報_Result
{
public Nullableint> データ区分 { get; set; }
public Nullabledecimal> グループ番号 { get; set; }
public Nullabledecimal> 店舗番号 { get; set; }
public string 店舗名 { get; set; }
public Nullabledecimal> 当日売上合計 { get; set; }
public Nullabledecimal> 累計売上合計 { get; set; }
public Nullabledecimal> 当日入金合計 { get; set; }
public Nullabledecimal> 累計入金合計 { get; set; }
public Nullabledecimal> 売上目標合計 { get; set; }
public Nullabledecimal> 売上達成率 { get; set; }
public Nullabledecimal> 入金達成率 { get; set; }
}
★→「2.MVC5 複数項目あるモデルの定義」へ続く
■インデックス
MVC5データベースファーストでちゃっちゃとモバイルサイト
1.MVC5 データベースファースト テーブル値関数の使用方法
2.MVC5 複数項目あるモデルの定義
3.MVC5 ビューでの数値項目右寄せカンマ編集
4.MVC5 BootStrap でのアコーディオン
5.MVC5 データベースファースト ASP.NET Identity に嵌る
6.MVC5 テーブル値関数の再取り込み方法
7.MVC5 Session情報に配列を記録する方法
8.MVC5 AWS へのアップロード方法
9.SQL Server 読み込み専用ユーザの設定方法
10.MVC5 セッションタイムアウト後にLogin画面に戻す方法
11.自己認証による https化
12.LinQ の遅延実行に泣く