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

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

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

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

ASP.NET MVC Framework

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

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

11290閲覧

「AddObjectは…のメンバーではありません」の原因がわかりません。

Eltk

総合スコア51

ASP.NET

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

ASP.NET MVC Framework

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

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2020/07/11 02:41

編集2020/07/11 06:18

先日、
https://teratail.com/questions/275580
の質問をさせていただいた者ですが、
今回は、アップロードしたファイルをデータベースに登録する処理の実装を試みております。

前提・実現したいこと

アップロードしたファイルをデータベースに保存する機能を実装したいです。
前回同様、以下のサイトを参考にほぼそのまま書いているのですが、表題のようなエラーが発生しております。

https://www.atmarkit.co.jp/fdotnet/dotnettips/939aspmvcfileupload2/aspmvcfileupload2.html

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

実行前の段階で、UploadController.vbのファイル内の「_db.AddObject("Photo", ph)」の箇所で、
以下のエラーが発生しております。

'AddObject'は'MyMvcContext'のメンバーではありません。

該当のソースコード

※Viewファイルです。(Index.vbhtml)※bodyタグの中身のみ記載
※参考サイトでは、<% %>のような記法で書かれておりますが、ところどころエラーが発生しましたので、書き直しています。

VisualBasic

1@Code 2 ViewData("Title") = "Index" 3End Code 4 5<h2>Index</h2> 6 7<div> 8 @Using (Html.BeginForm("DbUpload", "Upload", FormMethod.Post, New With {.enctype = "multipart/form-data"})) 9 @<input type="file" name="fl" size="50" /> 10 @<input type="submit" value="送信" /> 11 End Using 12 13 @ViewData("msg") 14 15</div>

※コントローラファイルです。(UploadController.vb)

VisualBasic

1Imports System.Web.Mvc 2Imports System.IO 3 4Namespace Controllers 5 Public Class UploadController 6 Inherits Controller 7 8 ' GET: Upload 9 Function Index() As ActionResult 10 Return View() 11 End Function 12 13 14 ' アップロード処理を行うUpload/Indexアクション 15 '(HTTP POSTによる実行) 16 <AcceptVerbs(HttpVerbs.Post)> 17 Function Index(ByVal fl As HttpPostedFileBase) As ActionResult 18 19 ' コンテンツ・タイプが"image/*"であるか(画像ファイルか) 20 ' をチェック 21 If fl.ContentType.StartsWith("image/") Then 22 23 ' アップロード先のパスを生成 24 Dim upfile As String = Server.MapPath("~/App_Data/Uploaded/") _ 25 & Path.GetFileName(fl.FileName) 26 27 ' 同名のファイルが存在する場合はエラー 28 If System.IO.File.Exists(upfile) Then 29 ViewData("msg") = "同名のファイルが存在します。" 30 Else 31 ' 画像ファイルで同名のファイルが存在しない場合は保存処理 32 fl.SaveAs(upfile) 33 ViewData("msg") = String.Format( 34 "{0}をアップロードしました。", fl.FileName) 35 End If 36 Else 37 ' 画像ファイルでない場合はエラー 38 ViewData("msg") = "画像以外はアップロードできません。" 39 End If 40 ' 入力元のフォームに結果を表示 41 Return View() 42 End Function 43 44 45 ' アップロード・フォームを生成するUpload/DbUploadアクション 46 Function DbUpload() As ActionResult 47 Return View() 48 End Function 49 50 ' アップロード処理を行うUpload/DbUploadアクション 51 ' (HTTP POSTによる実行) 52 <AcceptVerbs(HttpVerbs.Post)> 53 Function DbUpload(ByVal fl As HttpPostedFileBase) As ActionResult 54 55 ' コンテンツ・タイプが"image/*"であるか(画像ファイルか)を 56 ' チェック 57 If fl.ContentType.StartsWith("image/") Then 58 59 ' EDMのコンテキスト・オブジェクトを生成 60 Dim _db As New MyMvcContext() 61 62 ' エンティティにアップロード・ファイルの情報をセット 63 Dim ph As New Photo() 64 ph.Name = Path.GetFileName(fl.FileName) ' ファイル名 65 ph.Mime = fl.ContentType ' コンテンツ・タイプ 66 67 Dim data(fl.ContentLength) As Byte 68 fl.InputStream.Read(data, 0, fl.ContentLength) 69 ph.Data = data ' データ本体 70 71 ' エンティティを追加&データソースに反映 72 _db.AddObject("Photo", ph) 73 _db.SaveChanges() 74 ViewData("msg") = String.Format( 75 "{0}をアップロードしました。", fl.FileName) 76 Else 77 ' 画像ファイルでない場合はエラー 78 ViewData("msg") = "画像以外はアップロードできません。" 79 End If 80 ' 入力元のフォームに結果を表示 81 Return View() 82 End Function 83 84 85 End Class 86End Namespace

モデルファイルです。(Photo.vb)

VisualBasic

1Imports System 2Imports System.ComponentModel 3Imports System.ComponentModel.DataAnnotations 4 5Public Class Photo 6 7 Public Property Id As Integer 8 9 Public Property Name As String 10 11 Public Property Mime As String 12 13 Public Property Data As IList(Of HttpPostedFileBase) 14 15End Class

コンテキストファイルです。(MyMvcContext.vb)

VisualBasic

1Imports System.Data.Entity 2Imports Upload 3 4Public Class MyMvcContext : Inherits DbContext 5 Public Property Tweets As DbSet(Of Photo) ' Tweetsテーブル 6End Class

試したこと

エラー発生箇所となっているAddObjectは、_dbに対してのメソッドであり、_dbは(数行前に宣言している)MyMvcContextのインスタンスなので、
MyMvcContextに何かしら問題があるのでは?と考えてみましたが、その先がわかりません。

補足情報(FW/ツールのバージョンなど)

統合開発環境
Visual Studio2019
(言語:VB.NET、プロジェクトテンプレート:ASP.NET Webアプリケーション MVC)

MVCフレームワークのバージョン
5.2.7

使用PC
Windows10

※平日は仕事のため、返信が19:30以降になります。(22時以降は返信が翌日になることが多いです)
※休日の返信は不定期です。
申し訳ございませんが、どうぞよろしくお願いします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/07/11 03:30 編集

参考にしている @IT のサイトは、その URL を書くだけでなく、クリックしてそこに遷移できるようリンクを貼ってください。 前のスレッドのアプリは完成したのでしょうか? アップロードしたファイルをアプリのフォルダに保存するということだったはずですが、それは期待通りになっていますか? 今回参考にしている @IT の記事は、既存の SQL Server データベースがあって、それから DB First でコンテキストクラスとエンティティクラスを生成し、それを使ってファイルを保存するということですが、それは認識してますか? そこが全く分かってなくてメチャクチャという感じがしますけど・・・ 今度は参照している記事の内容をきちんとコピーできていることは十分確認ずみと思っていいですか? (前のような話はもう勘弁願います)
Eltk

2020/07/11 06:27

>SurferOnWww様 >参考にしている @IT のサイトは、その URL を書くだけでなく、クリックしてそこに遷移できるようリンクを貼ってください。 →修正いたしました。 >前のスレッドのアプリは完成したのでしょうか? →はい。ソリューションの中の指定フォルダに画像ファイルが格納されていることも確認できました。 >今回参考にしている @IT の記事は、既存の SQL Server データベースがあって、それから DB First でコンテキストクラスとエンティティクラスを生成し、それを使ってファイルを保存するということですが、それは認識してますか? →今回の記事がDB Firstであるという認識はできておりませんでした。指摘いただいてから気づきました。 >今度は参照している記事の内容をきちんとコピーできていることは十分確認ずみと思っていいですか? →一点、vbhtmlファイルのアクション名が、(以前と異なっていることに気が付き)修正させていただきました。申し訳ございません。
guest

回答1

0

ベストアンサー

いろいろ分かってなくて迷走している感じで、先は長そうですがとりあえず説明します。

今回参考にしている @IT の記事は、既存の SQL Server データベースがあって、それから DB First でコンテキストクラスとエンティティクラスを生成し、それを使ってファイルを保存しています。また、記事が古くて、生成されるコンテキストクラスは ObjectContext クラス(DbContext クラスではなくて)を継承しているようです。

まずそのあたりに着目して、自分の書いているコードは何が問題なのかを、時間がかかるかもしれませんが、基本的なことなので理解できるまでよく考えてください。

まず、エラーメッセージ、

'AddObject'は'MyMvcContext'のメンバーではありません。

・・・ですが、質問者さんの書いた MyMvcContext.vb の MyMvcContext クラスは DbContext クラスを継承していますが、それには AddObject メソッドはないということでエラーになってます。

昔は DB First でコンテキストクラスを生成すると、デフォルトでは ObjectContext クラスを継承しました。ObjectContext クラスには AddObject メソッドが含まれます。@IT の記事はそれを使っているようです。

ObjectContext.AddObject(String, Object) メソッド
https://docs.microsoft.com/ja-jp/dotnet/api/system.data.objects.objectcontext.addobject?view=netframework-4.8

もう一つ、もっと根本的な問題ですが、質問者さんは DB First と Code First でのコンテキストクラス / エンティティクラスの作り方の違いが分かってないようです。

今回参考にしている @IT の記事は DB First です。そのようにしたいのであれば、まず SQL Server に @IT の記事のスキーマのデータベースを作ってください。そして、Visual Studio の ADO.NET Entity Data Model ウィザードを使って、その DB から EDM を作成します。

具体例は下の記事のステップ (2) ~ (10) を見てください。

スキャフォールディング機能
http://surferonwww.info/BlogEngine/post/2017/07/23/creating-controller-and-view-in-mvc-using-scaffolding-function.aspx

これで以下の画像のようなコンテキストクラスと、

イメージ説明

DB のテーブルの数だけエンティティクラスが自動的に生成されます。(下の画像は Employees の例。赤枠で囲った Photo が画像データを保存するものです)

イメージ説明

これを利用して、アクションメソッドでは以下のようにして DB に保存できるはずです。

private NORTHWINDEntities db = new NORTHWINDEntities(); db.Employees.Add(<画像を含む enployee モデル>); db.SaveChanges();

投稿2020/07/11 04:31

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Eltk

2020/07/11 06:31

>SurferOnWww様 詳しく教えていただき、ありがとうございます。 時間はかかりましたが、添付記事を参考に一つ一つ実施し、無事エラーを解消することができました。 ありがとうございます。 ObjectContextを使うことが古い(Db Firstが良くない?)ような印象を受けましたので、今後、Code Firstでの実装方法を模索した方が良いのかなとも思いました。 いつもありがとうございます。
退会済みユーザー

退会済みユーザー

2020/07/11 06:54 編集

> ObjectContextを使うことが古い(Db Firstが良くない?)ような印象を受けましたので、今後、Code Firstでの実装方法を模索した方が良いのかなとも思いました。 それは誤解です。上の回答に貼ったコンテキストクラスの画像を見てください。DB First で作ったコンテキストクラスですが DbContext クラスを継承しています。 そもそも、DB First にするか Code First にするかを選べることは現実的にはないはずです。既存のデーターベースがあって、それに対する操作を行う場合は DB First しか選択肢はないです。 質門者さんの参考にしている @IT の記事は古いので、ObjectContext を使っていたり Razor 表記になっていなかったりしてます。もっと新しい記事を探すことをお勧めします。
Eltk

2020/07/11 09:23

>SurferOnWww様 自学習の段階ではどちらでも選べるけども、実際の仕事では自分の任意で決めれないので、 両方使えるようにしておいた方が良いということですね。 わかりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問