🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Entity Framework

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

MVC

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

ASP.NET

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

Q&A

解決済

1回答

2304閲覧

EntityFrameworkを使用したASP.NET mvcについて

退会済みユーザー

退会済みユーザー

総合スコア0

Entity Framework

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

MVC

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

ASP.NET

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

0グッド

0クリップ

投稿2021/03/09 00:48

編集2021/03/09 11:16

ASP.NET Core MVCアプリケーションを弄っています。
根本的な事で大変恐縮ですが、ご教授お願い致します。
また、複数まとめて質問させていただきます。よろしくお願いいたします。

分からないこと

  • データベースを操作したいので、EntityFrameworkを使用して、Modelからテーブルを作成しました。

この為、Modelはデータベースの各フィールドに対応するプロパティを持つ、1レコードのデータオブジェクトです。

csharp

1 public class SampleModel 2 { 3 // ID 4 public long Id { get; set; } 5 : 6 // 年齢 7 public int Age { get; set; } 8 // 作成日時 9 public DateTime CreateDate { get; set; } 10 // 更新日時 11 public DateTime UpdateDate { get; set; } 12 }

「Modelはビジネスロジックを含む」という認識があるのですが、Modelの集合(DbSet<SampleModel>など)を参照・操作するロジックは、どこに持たせるのでしょうか?
(例:平均年齢を算出する、など)


  • EntityFrameworkを使用したViewを、上記Modelからスキャフォールディングを使って作成しました。

cshtml

1@model IEnumerable<CoundTest.Models.SampleModel> 2 3@{ 4 ViewData["Title"] = "Index"; 5} 6 7<h1>Index</h1> 8 9<table> 10 <thead> 11 <tr> 12 <th>@Html.DisplayNameFor(model => model.AddressCode)</th> 13 : 14 <th>@Html.DisplayNameFor(model => model.UpdateDate)</th> 15 </tr> 16 </thead> 17 <tbody> 18 @foreach (var item in Model) 19 { 20 <tr> 21 <td>@Html.DisplayFor(modelItem => item.AddressCode)</td> 22 : 23 <td>@Html.DisplayFor(modelItem => item.UpdateDate)</td> 24 </tr> 25 } 26 </tbody> 27</table>

上記Viewを見ると、Modelの構造(プロパティ)を把握しているように思えます。
「ViewとModelの関心を分離する」という意味からずれている気がするのですが、
どいうことなのでしょうか?


盛大に勘違いしているかもしれませんが、よろしくお願いいたします。

追記

開発環境

  • Windows 10 Pro 20H2
  • .NET Core 3.1
  • Microsoft Visual Studio Community 2019 Version 16.7.7
  • Microsoft.AspNetCore.App 3.1.8
  • Microsoft.NetCore.App 3.1.0
  • Microsoft.EntityFrameworkCore 5.0.3
  • Microsoft.EntityFrameworkCore.SqlServer 5.0.3
  • Microsoft SQL Server 2019 15.0.2000.5

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/03/09 01:12

開発環境(OS, Visual Studio, Core のバージョン、DB サーバーは何かとそのバージョン・エディションなど)を書いてください。
退会済みユーザー

退会済みユーザー

2021/03/09 11:28

補足いたしました。
guest

回答1

0

ベストアンサー

ネットなどでよく目にする一般的な MVC の Model の説明は、例えば Wikipedia の記事(URL 下記)にあるように「アプリケーションデータ、ビジネスルール、ロジック、関数」という役割を持ち、クライアント側から見て View と Controller の背後にあるという構成で説明されていることが多いと思います。

Model View Controller
https://ja.wikipedia.org/wiki/Model_View_Controller

ASP.NET MVC で言う Model はそれより広い範囲、即ち「入力モデル」「ビューモデル」「ドメインモデル」という 3 種類の役割を持ちます。詳しくは以下の記事を読んでください。

ASP.NET MVC の Model
http://surferonwww.info/BlogEngine/post/2020/05/29/model-in-aspnet-mvc.aspx

質問者さんのコードにある SampleModel クラスも「入力モデル」「ビューモデル」「ドメインモデル」という 3 種類の役割を持ちます。

View のコードにある @model IEnumerable<CoundTest.Models.SampleModel> は「ビューモデル」としての役割、即ち Controller から View へデータを渡す役割を果たすものです。

【追記】

一つ質問に回答してなかったので追記しておきます。

Modelの集合(DbSet<SampleModel>など)を参照・操作するロジックは、どこに持たせるのでしょうか?

コンテキストクラスのことですよね。質問者さんの管理しやすい場所どこでも良いと思います。Microsoft のチュートリアルにならって Data とか DAL (Data Access Layer) という名前のフォルダを作ってそこに配置してはいかがですか。

ASP.NET Core MVC と EF Core - チュートリアル シリーズ
https://docs.microsoft.com/ja-jp/aspnet/core/data/ef-mvc/?view=aspnetcore-5.0

エンティティクラス(SampleModel クラス)のファイルの中に一緒に実装しても何ら支障はないですし、質問のコード程度なら別にフォルダを多く作るより分かりやすくて良いかもしれません。

リポジトリパターンというのがありますが、それを考える段階でもないと思いますし。

ASP.NET MVC アプリケーションでのリポジトリと作業単位のパターンの実装 (9 件)
https://docs.microsoft.com/ja-jp/aspnet/mvc/overview/older-versions/getting-started-with-ef-5-using-mvc-4/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application

投稿2021/03/09 01:38

編集2021/03/09 09:19
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2021/03/09 12:06

すみません。よければ教えてください。 リンクのところ読ませていただきました。 自分はMVCについて、他のフレームワークで実装したことなどはなく、webの情報から なんとなく、こんなんじゃないかと考えているわけなのですが・・・ 根本的な「ViewとModelを分離したい」というところで、 図を見るに、少なくともASP.NET MVCでは、ビューがモデル(ビューモデル)を知ってしまっている(=分離できていない) と考えてしまうのですが、「ViewとModelを分離したい」という意味をどのように解釈すれば良いのでしょうか? - 別にViewはModelを操作できるわけではないから? - Model(ビューモデル)はControllerから渡されるただのデータであって、Model(ドメインモデル)を知っているわけではないから(ドメインモデルとビューは分離されているから)?
退会済みユーザー

退会済みユーザー

2021/03/09 12:44

MVC の Model はこうであるべきだという強い思い込み・呪縛(?)から離れて、ASP.NET MVC の Model はこういうもの(回答で紹介した記事参照)と考えてください。そうすれば「ViewとModelを分離したい」とかの話は忘れることができてすべて解消するかと思いますけど。
退会済みユーザー

退会済みユーザー

2021/03/09 23:17

分かりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問