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

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

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

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

ASP.NET MVC Framework

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

Q&A

解決済

1回答

1594閲覧

【EntityFramework、ASP.net MVC】スキャフォールディングで、Viewに主キー関係のコードが生成される

HikaruS.

総合スコア33

Entity Framework

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

ASP.NET MVC Framework

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

0グッド

0クリップ

投稿2019/09/25 07:37

編集2019/09/26 06:38

お世話になっております。
今、ASP.net MVCの学習のため、以下のサイトを参考にテストプロジェクトを作成しています。
連載:ASP.NET MVC入門【バージョン3対応】 - @IT
(このサイトではEntityFrameworkは4.1、ASP.net MVCは3を利用しているようなのですが、私の環境ではそれぞれ6、5を使用しています。)

先程スキャフォールディングを用いてCRUD付きController+Viewをテンプレートから作ってみたのですが、[Key]属性を指定しているプロパティに関するコードがViewに自動生成されてしまいました。
参考にしているページでは、 Key属性のコントロールは自動生成されない 主キー項目に関するコードは自動生成されない と書いてあるのですが、何か間違ったのでしょうか?
記事で使っているEntityFramework・ASP.net MVCのバージョンと私の使用しているバージョンが違いますが、これらのバージョン間で何か挙動が変わったのでしょうか?

ご回答頂けましたら幸いです。


ご回答頂いた内容を元に私が試した結果、判明したことに関係ありそうな内容を見つけたのでメモしておきます。
asp.net mvc - How To Scaffold a View Model in MVC 5 - Stack Overflow

Keep data context class empty and then try to add the view. It worked for me. Also, add [Key] to any id attribute.

なんらかの場合においては、data context classのプルダウンを空欄にしなくてはいけないということなのでしょうか?

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/09/25 08:02 編集

「[Key]属性を指定しているプロパティ用のコントロール」とはなんですか? 参考にしている記事のどこに「Key属性のコントロールは自動生成されない」と書いてあるのですか?(Key とか属性でそのページを検索してもそのように書いてあるところは見当たりませんけど・・・)
HikaruS.

2019/09/25 08:02

すみません、「[Key]属性を指定しているプロパティ」とは書かれていませんでした。 私が指していたのは「主キー項目は自動生成されない」から始まるセクションです。 筆者様の言う「主キー項目」が「[Key]属性を指定しているプロパティ」と完全に意味が一致するかはわかりませんが、ここで言う「主キー項目」は[Key]属性を指定されており、私がそう解釈して記載しておりました。
退会済みユーザー

退会済みユーザー

2019/09/25 09:31

表題と本文中の「[Key]属性のプロパティ用のコントロール」という表現は適切ではないと思います。特にコントロールという表現が NG です。書き直していただくようお願いします。(例: [Key]属性のプロパティ用のコントロールが作成される ⇒ View に主キー関係のコードが生成される)
HikaruS.

2019/09/26 00:29

何度もお手数をおかけしすみません。 Windows フォームと同じ感覚で「コントロール」という用語を使ってしまっていました。 適切な文言に修正させていただきました。ご指摘いただきありがとうございました。
guest

回答1

0

ベストアンサー

主キー項目は自動生成されない と書いてあるのですが、

MVC5 でもその通りだと思いましたが、念のため自分の環境の Visual Studio Community 2015 の MVC5 で確認してみました。やはり @IT の記事の通りの結果(View に Isbn 関係のコードは含まれない)となります。

質問者さんのケースで何故違う結果になったのかは分かりませんが、自動生成されたのならそれはそれで問題ないので、そのまま使えば良いと思いますが。

参考までに自分の環境での結果を書いておきます。

Model

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.ComponentModel.DataAnnotations; using System.Globalization; using System.Web.Mvc; namespace Mvc5App.Models { public class Book { [Key] [Display(Name = "ISBNコード")] [Required(ErrorMessage = "{0}は必須です。")] [RegularExpression("[0-9]{3}-[0-9]{1}-[0-9]{3,5}-[0-9]{3,5}-[0-9A-Z]{1}", ErrorMessage = "{0}はISBNの形式で入力してください。")] public string Isbn { get; set; } [Display(Name = "書名")] [Required(ErrorMessage = "{0}は必須です。")] [StringLength(100, ErrorMessage = "{0}は{1}文字以内で入力してください。")] public string Title { get; set; } [Display(Name = "価格")] [Range(100, 10000, ErrorMessage = "{0}は{1}~{2}の間で入力してください。")] public int? Price { get; set; } [Display(Name = "出版社")] [StringLength(30, ErrorMessage = "{0}は{1}文字以内で入力してください。")] [InArray("翔泳社,技術評論社,秀和システム,毎日コミュニケーションズ,日経BP社,インプレスジャパン")] public string Publish { get; set; } [Display(Name = "刊行日")] [Required(ErrorMessage = "{0}は必須です。")] public DateTime Published { get; set; } public virtual ICollection<Review> Reviews { get; set; } } public class Review { public int ReviewId { get; set; } public string Title { get; set; } public string Body { get; set; } public DateTime CreatedAt { get; set; } } // ・・・InArrayAttribute 関係のコード(省略)・・・ }

Controller / Action Method

Create2 を新たに追加しそれからスキャフォールディング機能を使って View を自動生成

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using Mvc5App.Models; namespace Mvc5App.Controllers { public class BookController : Controller { // ・・・既存の Create のコード(省略)・・・ // 入力フォームを生成するためのCreateアクション public ActionResult Create2() { return View(); } // [Create]ボタンをクリックしたときに呼び出されるCreateアクション [HttpPost] public ActionResult Create2(Book book) { if (ModelState.IsValid) { //db.Books.Add(book); //db.SaveChanges(); return RedirectToAction("Index", "Home"); } return View(book); } } }

Add View ダイアログの設定

イメージ説明

View

自動生成されたもの。@IT の記事に書いてある通り、Isbn 関係のコードは含まれない。

@model Mvc5App.Models.Book @{ ViewBag.Title = "Create2"; Layout = "~/Views/Shared/_Layout.cshtml"; } <h2>Create2</h2> @using (Html.BeginForm()) { @Html.AntiForgeryToken() <div class="form-horizontal"> <h4>Book</h4> <hr /> @Html.ValidationSummary(true, "", new { @class = "text-danger" }) <div class="form-group"> @Html.LabelFor(model => model.Title, htmlAttributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.Title, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.Title, "", new { @class = "text-danger" }) </div> </div> <div class="form-group"> @Html.LabelFor(model => model.Price, htmlAttributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.Price, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.Price, "", new { @class = "text-danger" }) </div> </div> <div class="form-group"> @Html.LabelFor(model => model.Publish, htmlAttributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.Publish, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.Publish, "", new { @class = "text-danger" }) </div> </div> <div class="form-group"> @Html.LabelFor(model => model.Published, htmlAttributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.Published, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.Published, "", new { @class = "text-danger" }) </div> </div> <div class="form-group"> <div class="col-md-offset-2 col-md-10"> <input type="submit" value="Create" class="btn btn-default" /> </div> </div> </div> } <div> @Html.ActionLink("Back to List", "Index") </div> @section Scripts { @Scripts.Render("~/bundles/jqueryval") }

実行結果

イメージ説明

投稿2019/09/25 08:52

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

HikaruS.

2019/09/26 00:27

ご回答ありがとうございます。 今、こちらのコードと私の環境にどういった差異があるのか確認させていただいています。 迅速にお答えいただきまして恐縮ですがベストアンサー設定までどうぞお待ちくださいませ。
HikaruS.

2019/09/26 06:30

@SurferOnWww 様、ご確認いただき誠にありがとうございました。 諸々確認した結果、Add View ダイアログで「Data context class」を選択するかしないかで、キー項目に関するコードが生成される/されないが分岐していることがわかりました(コンテキストクラスを選択するとキー項目のコードも生成される)。 これはスキャフォールディングの仕様なのでしょうか? また、利用する予定のコンテキストクラスが存在している場合、Add Viewダイアログでコンテキストクラスを選択するという手順で間違っていないでしょうか?(サンプルと異なる挙動をしているので、私の把握できない範囲で何か間違いを犯していないかどうかを気にしております。)
退会済みユーザー

退会済みユーザー

2019/09/26 08:04

> これはスキャフォールディングの仕様なのでしょうか? 仕様はわかりません。それに関するドキュメントも見つけられないので想像ですが、「Data context class」を選択すると、Visual Studio のデザイナが何らかの手段(実際に DB に接続に行く?・・・コンテキストクラスに接続情報があるのでそれは可能なはず)で当該主キー列が Identity ではないと判定できて、View に主キーをユーザーが入力できるコードを生成してくれるのではないかと思われます。 > 利用する予定のコンテキストクラスが存在している場合、Add Viewダイアログでコンテキストクラスを選択するという手順で間違っていないでしょうか? 間違っていないと思います。MVC5 のチュートリアル(URL 下記)ではそのようにしています。 Tutorial: Get Started with Entity Framework 6 Code First using MVC 5 https://docs.microsoft.com/ja-jp/aspnet/mvc/overview/getting-started/getting-started-with-ef-using-mvc/creating-an-entity-framework-data-model-for-an-asp-net-mvc-application
HikaruS.

2019/09/26 08:19

ご確認ありがとうございました。 当件チュートリアルでもこのようになっているということに加え、お詳しい方でも不明な部分があるということで、少なくともごく初歩的なミス等が原因ではないということを知ることができました。 学習中に不明点をおろそかにすると後々困るかと思い(特に影響はないであろう部分についても)細かく伺わせていただきましたが、後回しにしてもよさそうな高度な部分である可能性があるので一旦このあたりで当件閉めさせていただこうかと思います。 お手数をおかけしましたが、丁寧にご回答いただき誠にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問