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

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

ただいまの
回答率

89.13%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 130

ks1234

score 0

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」を明確に、「担当者」「管理者」として
記述する良い方法があれば、教えていただきたいと思います。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • ks1234

    2020/06/22 13:06 編集

    別名が付けられれば良いと考えてます。

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

    複数テーブルへリレーションを設定すると、連番が付与されたナビゲーションプロパティに
    なると思いますが(思い込んでいるだけかもしれませんが)、作成者以外がプログラム修正を
    する際にマジックナンバーのような記述にならない方法を探しています。
    (上記にはこだわりません、一般的にはどうするのでしょうか?...)

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

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

    キャンセル

  • SurferOnWww

    2020/06/23 14:23

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

    キャンセル

  • SurferOnWww

    2020/06/30 11:57

    このスレッドはそろそろクローズしてもらえませんか? このままオープンにしておいても「別名」とか「自動修正」の方法の回答はなさそうです。

    まだ諦めきれないということであれば、別に新しいスレッドを立てて、タイトルと内容から「ASP.NET MVC」色を薄めて(それを見ただけで中身を読まないでスルーする人は多々いると思いますので)、Entity Framework, DB First, C# の話として質門し直した方がよさそうな気がします。

    勝手なことを言わせてもらえると、自分がいつも見ている ASP.NET のタグで選択したスレッドに未解決のものがあるのは気になるのです。私の回答をベストアンサーにする必要はありません。質問者さんが回答欄に何か、例えば質問しなおす旨書いて、クローズしてもらえればと思います。

    キャンセル

回答 2

check解決した方法

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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/23 16:07

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

    キャンセル

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

  • ただいまの回答率 89.13%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる