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

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

新規登録して質問してみよう
ただいま回答率
85.48%
ASP.NET

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

Q&A

解決済

1回答

3149閲覧

Entity Frameworkのデバッグ法について

devbgn

総合スコア22

ASP.NET

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

0グッド

0クリップ

投稿2019/03/07 10:42

編集2019/03/08 09:40

〇わからない点
現在、C#にてEntity Frameworkの勉強をしています。
そこで1点疑問があり質問をさせていただきました。

今、Publisherテーブル、Bookテーブル、Authorテーブルを
作成し、下記のmodelinitializerにて初期値を設定して
中身を表示しようとしています。
aspx.csファイルにて初期値を取り出して表示させることは
うまくいっているのですが、このイニシャライザーにブレークポイントを
貼っても処理がキャッチできません。

そこでお聞きしたいのですが、Entity Frameworkでは
エンティティやイニシャライザーにブレークポイントを張っても
キャッチできないのでしょうか?
もしできるのであれば設定変更などの方法をご教授頂けますと
幸いです。

環境はvisual studio 2015 proです。

C#

1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Web; 5using System.Data.Entity; 6 7namespace WebApplication1 8{ 9 //継承元のクラス名でデータベースの作成をコントロール 10 public class BookModelInitializer : DropCreateDatabaseAlways<BookModel> 11 { 12 protected override void Seed(BookModel context) 13 { 14 base.Seed(context); 15 16 var publisher1 = new Publisher() 17 { 18 PublisherName = "A出版" 19 }; 20 var publisher2 = new Publisher() 21 { 22 PublisherName = "B出版" 23 }; 24 25 var author1 = new Author() 26 { 27 AuthorName = "著者A" 28 }; 29 30 var author2 = new Author() 31 { 32 AuthorName = "著者B" 33 }; 34 35 var books = new List<Book> 36 { 37 new Book { 38 Author = author1, 39 BookTitle = "titile1", 40 Publisher = publisher1, 41 Price = 1000 42 }, 43 new Book { 44 Author= author2, 45 BookTitle = "titile2", 46 Publisher = publisher2, 47 Price = 2000 48 } 49 }; 50 51 foreach (Book book in books) 52 { 53 context.Books.Add(book); 54 } 55 context.SaveChanges(); 56 } 57 } 58}

【追記】
私が実行したaspx.csファイルを下記に示します。
尚動作は下記のaspx.csファイルを実行すると正常に文字列が表示されます。

C#

1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Web; 5using System.Web.UI; 6using System.Web.UI.WebControls; 7 8namespace WebApplication1 9{ 10 public partial class WebForm1 : System.Web.UI.Page 11 { 12 protected void Page_Load(object sender, EventArgs e) 13 { 14 string bookdata = ""; 15 16 using (var context = new BookModel()) 17 { 18 var books = context.Books; 19 20 foreach (var book in books) 21 { 22 bookdata += string.Format("Id:{0}, 図書名{1}, 著者名{2}, 出版社名:{3}, 価格:{4}円<br>", 23 book.BookId, book.BookTitle, book.Author.AuthorName, book.Publisher.PublisherName, book.Price); 24 } 25 26 Label1.Text = bookdata; 27 28 Label1.ForeColor = System.Drawing.Color.Aqua; 29; } 30 } 31 } 32}

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

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

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

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

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

guest

回答1

0

ベストアンサー

このイニシャライザーにブレークポイントを貼っても処理がキャッチできません。

Seed メソッドでしょ? そこには EF Cord First で DB を生成するとき以外は飛んでこないからではないですか。

【追記】

下のコメント欄の 2019/03/08 13:03 の私のコメントで、

自分の環境で試してみましたが Seed メソッド内にブレークポイントを置けば期待通りそこで止まってデバッグ可能でした。質問者さんのケースで何故ダメか不明ですが、やり方の問題ではないかと思います。後で回答欄に詳細を書いておきます。

・・・と述べましたが、それを以下に書きます。

自分の環境は、Windows 10 Pro 64-bit, Visual Studio Community 2015 Update 3, ASP.NET 4.6.1 テンプレートで作った Web フォームアプリです。Visual Studio から IIS 10.0 Express 上で実行しています。DB は SQL Server 2016 LocalDB を使って EF Code First で DB を生成しています。

モデルのコードは以下の記事のものをそのまま使っています。ただし、DropCreateDatabaseIfModelChanges<T> を DropCreateDatabaseAlways<T> に、接続文字列を LocalDB 用に変更しました。

第2回 Entity Frameworkコード・ファーストでモデル開発
http://www.atmarkit.co.jp/fdotnet/aspnetmvc3/aspnetmvc3_03/aspnetmvc3_03_01.html

結果、DB が存在しない初期状態ではもちろん、Web アプリを終了して再度実行しても、期待通り Seed メソッド内のブレークポイントで止まってステップ実行・デバッグが可能となります。

イメージ説明

なお、イニシャライザが呼び出されるのは当該コンテキストを使って DB にアクセスするときなので、Seed メソッドに制御が飛ぶのはその時点になります。具体的には、上の紹介した記事で言うと、以下のようなコードのあるページを呼び出す必要があります。質問者さんのケースで Seed に制御が飛ばないのは DB にアクセスしてないからでは?

イメージ説明

ご参考までに実行結果の画像もアップしておきます。

イメージ説明

投稿2019/03/07 11:00

編集2019/03/08 04:40
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

devbgn

2019/03/08 00:09

>SurferOnWwwさん ご回答ありがとうございます。 ブレークポイントの意図ですが、DB生成過程でオブジェクトがどう変化していくかを確認しようと思っていました。DB生成はブレークポイントでは確認できないということでしょうか。
退会済みユーザー

退会済みユーザー

2019/03/08 00:29 編集

DB が存在しない初期状態で試したのですか? 質問に初期値を表示できたと書いてありますが、表示できたということは既に DB は生成済みなので、それ以降は何度やっても Seed に制御が飛ぶことはないのですが・・・
退会済みユーザー

退会済みユーザー

2019/03/08 01:13

失礼しました、DropCreateDatabaseAlways<T> を継承してますね。それでも Seed に制御が飛んでこないということですか・・・ どういう手順で試したのでしょう?
退会済みユーザー

退会済みユーザー

2019/03/08 04:03

自分の環境で試してみましたが Seed メソッド内にブレークポイントを置けば期待通りそこで止まってデバッグ可能でした。質問者さんのケースで何故ダメか不明ですが、やり方の問題ではないかと思います。後で回答欄に詳細を書いておきます。
devbgn

2019/03/08 09:50

>SurferOnWwwさん ご丁寧に検証結果を教えてくださりありがとうございます。 本日再度試してみたところPage_Load、Seedメソッド内の両方のブレークポイントで処理が止まることを確認しました。昨日から全くソースが変わっていないので全く不思議ではあります。 今後も再現するようでしたら詳細を調査しようと思います。 またご提示頂いたURLも後学のために参考にしたいと思います。 ご対応くださりありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問