質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

Q&A

解決済

2回答

2194閲覧

ASP.NET MVCにおけるナビゲーションプロパティ名について

ks1234

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

0グッド

0クリップ

投稿2020/06/22 01:16

編集2020/06/22 02:49

ASP.NET MVC(C#)で、Entity FrameworkのDBファーストを
利用しWEBシステムの開発を行っています。

【開発環境】
Visual Studio Community 2019
ASP.NET MVC 5.2
Entity Framework 6.2
SQLSERVER 2017

DBにいわゆるコードマスタ(汎用マスタ)を利用しており、
テーブルAとテーブルBとの間に複数のリレーションシップを設定しています。

(例)
テーブルA(日報トラン)レイアウト
id、日付、内容、金額、担当者、管理者
1、2020/6/22、作業A、1000、31、41
2、2020/6/23、作業B、2000、32、41

テーブルB(コードマスタ)レイアウト
id、コード名称、コード、内容
1、性別、1、男
2、性別、2、女
3、ユーザ、31、佐藤
4、ユーザ、32、高橋
5、ユーザ、41、安倍

上記の例の場合、テーブルAの「担当者」「管理者」に対して
テーブルBのユーザをリレーションシップとしてDBで設定しています。

Entity FrameworkのDBファーストでモデルを自動生成した際に、
リレーションシップの項目として、ナビゲーションプロパティが生成されますが、
生成される名前が、テーブル名に連番が付与された形になり、
View側で扱う際に区別が付かないものになってしまいます。

以下のようにナビゲーションプロパティが自動生成
テーブルB1
テーブルB2
テーブルB3

Entity Frameworkで関連テーブルの読み取りを行い
Viewで利用する際に以下の記述となる。

テーブルA.テーブルB1.内容
→担当者

テーブルA.テーブルB2.内容
→管理者

「テーブルB1」「テーブルB2」を明確に、「担当者」「管理者」として
記述する良い方法があれば、教えていただきたいと思います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hihijiji

2020/06/22 01:36

ナビゲーションプロパティ名ってデザイナから変更できませんでしたか?
ks1234

2020/06/22 01:44

変更できますが、DBに変更(項目追加・データ型変更等)があった際に、 「データベースからモデルを更新」を実行すると、元に戻ってしまうので、 デザイナでの手動修正は実施しない方向で考えています。
退会済みユーザー

退会済みユーザー

2020/06/22 02:41

ASP.NET のタグをつけてください。Visual Studio のバージョンを質問欄に追記してください。
ks1234

2020/06/22 02:51

ASP.NETのタグ、Visual Studioのバージョンを追記しました。
退会済みユーザー

退会済みユーザー

2020/06/22 03:09 編集

> デザイナでの手動修正は実施しない方向で考えています。 そうするとナビゲーションプロパティは使えないという話になり、それを使った「テーブルA.ナビゲーションプロパティ名.内容」というような記述はできないはずですが、話が矛盾してませんか? 「テーブルB1」の別名として「担当者」、「テーブルB2」の別名として「管理者」という名前を付けて、それを Controller のコードで使うことはできないかということですか?
ks1234

2020/06/22 04:07 編集

別名が付けられれば良いと考えてます。 また、DB変更が発生し、モデルを自動生成した際に、手動で行うデザイナ修正の 作業も自動で行えるような仕組みがあれば、それでも良いです。 複数テーブルへリレーションを設定すると、連番が付与されたナビゲーションプロパティに なると思いますが(思い込んでいるだけかもしれませんが)、作成者以外がプログラム修正を する際にマジックナンバーのような記述にならない方法を探しています。 (上記にはこだわりません、一般的にはどうするのでしょうか?...) 現状は、以下のようにコーディングして、デザイナでの手動修正を避ける形で ナビゲーションプロパティを利用しています。 【コントローラ】 var data = db.テーブルA.Include(x => x.テーブルB1).Include(x => x.テーブルB2) 【ビュー】 data.テーブルB1.内容
退会済みユーザー

退会済みユーザー

2020/06/23 05:23

質問者さん、無言になってしまいましたが、回答しましたのでそれに対するフィードバックをタイムリーに返してください。分かった・分からなかった、役に立った・立たなかったぐらいのフィードバックはすぐ返せるはず。無言はとにかく NG です。
退会済みユーザー

退会済みユーザー

2020/06/30 02:57

このスレッドはそろそろクローズしてもらえませんか? このままオープンにしておいても「別名」とか「自動修正」の方法の回答はなさそうです。 まだ諦めきれないということであれば、別に新しいスレッドを立てて、タイトルと内容から「ASP.NET MVC」色を薄めて(それを見ただけで中身を読まないでスルーする人は多々いると思いますので)、Entity Framework, DB First, C# の話として質門し直した方がよさそうな気がします。 勝手なことを言わせてもらえると、自分がいつも見ている ASP.NET のタグで選択したスレッドに未解決のものがあるのは気になるのです。私の回答をベストアンサーにする必要はありません。質問者さんが回答欄に何か、例えば質問しなおす旨書いて、クローズしてもらえればと思います。
guest

回答2

0

自己解決

T4テキストテンプレートのカスタマイズが今回の質問の回答に
該当するようなので、そちらの方法を試してみたいと思います。

投稿2020/06/30 08:42

ks1234

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

「テーブルB1」の別名として「担当者」、「テーブルB2」の別名として「管理者」という名前を付けて、それを Controller のコードで使うことはできないかということですか?

別名が付けられれば良いと考えてます。また、DB変更が発生し、モデルを自動生成した際に、手動で行うデザイナ修正の作業も自動で行えるような仕組みがあれば、それでも良いです。

そういう方法はないと思います。少なくとも自分は知りません。一応調べましたけど、国外のサイトにもそういう情報は見つかりませんでした。

なので、少なくとも「別名」とか「自動修正」の方法は自分には分かりません。そこはお役に立てないので、他の方の回答に期待してください。

作成者以外がプログラム修正をする際にマジックナンバーのような記述にならない方法を探しています。

「作成者以外がプログラム修正」というのがどの範囲なのか分かりませんが、例えば、アプリが、

ビュー/コントローラ ⇔ リポジトリクラス ⇔ Entity Data Model ⇔ SQL Server

・・・というような構造になっていて、コントローラとビューだけが「作成者以外がプログラム修正」の範囲であれば、リポジトリクラスの方で対応を考えるということで可能だと思います。

現状は、以下のようにコーディングして、デザイナでの手動修正を避ける形でナビゲーションプロパティを利用しています。

【コントローラ】
var data = db.テーブルA.Include(x => x.テーブルB1).Include(x => x.テーブルB2)
【ビュー】
data.テーブルB1.内容

「デザイナでの手動修正は実施しない」ということであれば、コントローラの方はそれしか手はないと思います。

Include を使わないで、クエリ式で JOIN することは可能です。その際はコンテキストクラスに定義されているであろう、

public virtual DbSet<テーブルB> テーブルB { get; set; }

の「テーブルB」という名前を使うことになると思います。「管理者」とか「担当者」というように明示的にはコードで表せないので質問者さんにはあまり意味はないかもしれませんが。一応、検討してみてはいかがですか?

ビューの方は、ビューに渡す Model を別に定義して、コントローラでそれに詰め替えてビューに渡せば、model.管理者、model.担当者というようにできますが。

投稿2020/06/22 04:56

編集2020/06/22 05:05
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ks1234

2020/06/23 07:07

回答ありがとうございます。 他の方の回答も少し待ってみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問