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

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

新規登録して質問してみよう
ただいま回答率
85.44%
Entity Framework

Entity Frameworkは、.NET Framework 3.5より追加されたデータアクセス技術。正式名称は「ADO.NET Entity Framework」です。データベースエンジンに依存しておらず、データプロバイダの変更のみで様々なデータベースに対応できます。

C#

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

MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

ASP.NET

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

ASP.NET MVC Framework

ASP.NET MVC Frameworkは、MVCパターンをベースとした、マイクロソフトのウェブアプリケーション開発用のフレームワークです。

Q&A

解決済

1回答

11519閲覧

MVCにて複数テーブルの値を取得・表示したい。

hayato208

総合スコア19

Entity Framework

Entity Frameworkは、.NET Framework 3.5より追加されたデータアクセス技術。正式名称は「ADO.NET Entity Framework」です。データベースエンジンに依存しておらず、データプロバイダの変更のみで様々なデータベースに対応できます。

C#

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

MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

ASP.NET

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

ASP.NET MVC Framework

ASP.NET MVC Frameworkは、MVCパターンをベースとした、マイクロソフトのウェブアプリケーション開発用のフレームワークです。

0グッド

0クリップ

投稿2020/10/01 10:43

編集2020/10/01 14:13

前提・実現したいこと

前提
・Controllerに該当するStudentInfoesController.cs、Modelに該当するStudentInfo.cs、Viewに該当するIndex.chtmlを作成
・DBのリレーションは下図の通り
実現したいこと
・Index.cshtmlにて、UserInfoテーブルのデータを取得・表示したい
DBは下図の通りです。
イメージ説明

発生している問題・エラーメッセージ

・下記ViewにてStudentNameは表示されているが、ClassNameは表示されない。

該当のソースコード

DBは下記の通りUserInfoの外部キーにStudentIdを据えています。
UserInfo

CREATE TABLE [dbo].[UserInfo] ( [StudentId] INT NOT NULL, [UserInfoId] INT NOT NULL, [ClassName] NVARCHAR (128) NULL, PRIMARY KEY CLUSTERED ([UserInfoId] ASC), CONSTRAINT [FK_UserInfo_ToTable_3] FOREIGN KEY ([StudentId]) REFERENCES [dbo].[StudentInfo] ([StudentId]) );

StudentInfo

CREATE TABLE [dbo].[StudentInfo] ( [StudentId] INT NOT NULL, [StudentName] NVARCHAR (128) NULL, PRIMARY KEY CLUSTERED ([StudentId] ASC) );

ControllerではUserInfoと内部結合しており、SELECTにてStudentId,StudentName,ClassNameを取得、Index.cshtmlにアクセスした際、StudentName,ClassNameを表示する処理を行いたいです。
ここで、StudentId,StudentNameは正常に取得・表示出来ておりますが、ClassNameはNULLを返している状態です。
*該当箇所のみ抜粋

Controller部分
StudentInfoesController.cs

C#

1 public ActionResult Index() 2 { 3 List<StudentInfo> model = null; 4 model = db.Database.SqlQuery<StudentInfo>(@" 5 SELECT 6 StudentInfo.StudentId, 7 StudentInfo.StudentName, 8 UserInfo.ClassName 9 INNER FROM 10 StudentInfo 11 JOIN 12 UserInfo 13 ON 14 StudentInfo.StudentId = UserInfo.StudentId 15 ").ToList(); 16 return View(model); 17 }

View部分
Index.cshtml

C#

1<!DOCTYPE html> 2 3<html> 4<head> 5 <meta name="viewport" content="width=device-width" /> 6 <title>生徒名簿</title> 7</head> 8<body> 9 <table class="table"> 10 <tr> 11 <th> 12 生徒名 13 </th> 14 <th> 15 クラス名 16 </th> 17 </tr> 18 19 @foreach (var item in Model) 20 { 21 <tr> 22 <td> 23 @Html.DisplayFor(modelItem => item.StudentName) 24 </td> 25 <td> 26 @Html.DisplayFor(modelItem => item.ClassName) 27 </td> 28 </tr> 29 } 30 </table> 31</body> 32</html>

Model部分
StudentInfo.cs

C#

1 public partial class StudentInfo 2 { 3 public int StudentId { get; set; } 4 public string StudentName { get; set; } 5 public string ClassName { get; set; } 6 7 public virtual ICollection<UserInfo> UserInfo { get; set; } 8 }

試したこと

・「サーバーエクスプローラー」→右クリック→「新しいクエリ」にてSQL単体を実行させたところ、ClassNameは取得出来ていた。
・SQL文にブレークポイントを置いて確かめたところ、ClassNameはNULLを返した。
・StudentInfoにて実行したCRUDををUserInfoでも実行したところ、StudentInfoのデータは取得・表示できた。
以上より、多重度が関係していると思ったのですが、多重度の違いによってデータの取得・表示が異なるのでしょうか。
助言いただけると幸いです、よろしくお願いいたします。

開発環境

ASP.NET MVC5.2.4
Entity Framework 6.2.0
Identity.Entity.Framework 2.2.2
DB:SQL Sever

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/10/01 11:35

> .NETアプリケーション開発入門を参考にDB Firstにて2つのView”StudentInfoes”、”UserInfoes”を作成 そのサイト、斜め読みしましたが、質問の話とは大幅に違うようですけど? テーブルの構造も分からないし、質問がテキトー&イイカゲンすぎ。質問本文だけ読めば分かるように書き直してもらえませんか。
hayato208

2020/10/01 14:14

回答ありがとうございます。質問文を修正しましたのでお手数をおかけしておりますが、今一度確認お願いいたします。
退会済みユーザー

退会済みユーザー

2020/10/02 00:38

DB の構造、正規化の方法から始まって、生 SQL を投げているところ、StudentInfo クラスの定義などもろもろ変です。 最初の DB の設計段階に戻って、全面的に見直し・書き換えた方がよさそうですが、取りあえず全面書き換えは置いといて、生 SQL を投げるところまでは今のまま進めるとしても・・・ SELECT クエリが間違っていませんか? SELECT... INNER FROM ... JOIN ... ON ... ではなくて SELECT... FROM ... INNER JOIN ... ON ... のはずです。 > 「サーバーエクスプローラー」→右クリック→「新しいクエリ」にてSQL単体を実行させたところ、ClassNameは取得出来ていた。 ということですが、試しに自分がそのような SQL を SSMS から発行しようとしたらエラーになったのですが? まずはそこ、次に StudentInfo クラスの定義が変です。自動生成されたものに手を加えたのですか?
guest

回答1

0

ベストアンサー

DB の構造、正規化の方法から始まって、生 SQL を投げているところ、StudentInfo クラスの定義などもろもろ変です。

最初の DB の設計段階に戻って、全面的に見直し・書き換えた方がよさそうですが、取りあえず全面書き換えは置いといて、生 SQL を投げるところまでは今のまま進めるとして・・・

2 点気が付いたところを書くと、

(1) SELECT クエリが間違っていませんか? SELECT... INNER FROM ... JOIN ... ON ... ではなくて SELECT... FROM ... INNER JOIN ... ON ... のはずです。

(2) StudentInfo クラスの定義が変です。Visual Studio のデザイナで自動生成されたものに手を加えたようですが、独自に Model を作ってそれを使うようにしてください。

上記を直せば動くと思います。以前、ADO.NET Entity Data Model を使って Microsoft のサンプルデータベース Northwind から EDM を作って使ったサンプルがあってので試してみました。

Northwind データベースの中で質問者さんの UserInfo, StudentInfo テーブルと構造がほぼ同じの Territories, Region を使います。

イメージ説明

SSMS で、作成した SELECT クエリで期待通りの結果が得られるかを確認。ちなみに、質問者さんが書いたような SELECT... INNER FROM ... JOIN ... ON ... にするとエラーになります。

イメージ説明

それを Action Method の DbContext.Database.SqlQuery の引数にコピペ。View に渡す Model は RegionViewModel という名前で自分で定義してそれを使う。

イメージ説明

View はスキャフォールディング機能を使って Visual Studio に自動生成させる。実行結果は以下の通り、SSMS での実行結果と同じになる。

イメージ説明

投稿2020/10/02 01:35

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

hayato208

2020/10/02 09:41

返答ありがとうございます。無事動きました。 >>(1) SELECT クエリが間違っていませんか? SELECT... INNER FROM ... JOIN ... ON ... ではなくて SELECT... FROM ... INNER JOIN ... ON ... のはずです。 申し訳ございません、仰るとおり私の記述したものでは動かなかったです。質問する際どこかでコピペミスしたようです。 >>(2) StudentInfo クラスの定義が変です。Visual Studio のデザイナで自動生成されたものに手を加えたようですが、独自に Model を作ってそれを使うようにしてください。 どうやら自動生成されるクラスはDBとの接続用みたいですね。新たにクラスを作成したら問題なく動きました。
退会済みユーザー

退会済みユーザー

2020/10/02 22:23

上にも書きましたが、DB の構造、正規化の方法から始まって、生 SQL を投げているところ、見直すことをお勧めします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.44%

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

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

質問する

関連した質問