トップ回答者
定義されてませんとなる。

質問
-
Visualstudio2015ですが、新規にプロジェクトをつくり(vbでWEBサイト)
app_codeフォルダーにlinq to sqlクラスのDataClasses1.dbml(DataClassex1DataContextという名前になるはず)を新規作成しました。
そして新規にtest.aspxを作成してtest.aspx.vbのPage_Loadに
dim db as new DataClasses1DataContextとすると型が定義されてないとエラーになります。
web.configには <add assembly="System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />とconnectionStringが記載されております。
このデータベースはほかでも使っており問題ないとおもっております。
newと入れたときにDataClasses1DataContextの項目が出てくるはずですがでてきません。(定義されてませんとでるので当然でしょうが)
なぜこのクラスが使えないのでしょうか、ほかのプロジェクトでは何回も作っているのですが。
回答
すべての返信
-
Web サイトプロジェクトで Visual Studio のデザイナを利用して、以下の記事のような手順で、.dbml ファイルを App_Code フォルダ下に作ったという理解でいいですか?
方法 : Web アプリケーションで LINQ to SQL クラスを作成する
https://msdn.microsoft.com/ja-jp/library/bb907587(v=vs.100).aspxであれば、
> そして新規にtest.aspxを作成してtest.aspx.vbのPage_Loadに
> dim db as new DataClasses1DataContextとすると型が定義されてないとエラーになります。というエラーが出るということは、App_Code フォルダのクラスファイルに DataClasses1DataContext クラスの定義がないということになります。
.dbml ファイルがきちんと作れていれば、.dbml ファイルの下に .designer.vb ファイルが自動生成され、その中に DataClasses1DataContext クラスの定義が含まれているはずですが、それがうまく行ってないのでは?
.designer.vb ファイルを開いて中身を調べてください。
-
作成方法はこのリンク(https://msdn.microsoft.com/ja-jp/library/bb907587(v=vs.100).aspx)通りに作成しています。
.designer.vbは出来ていて正常にみえます。
またDataClasses1.vbというのもできていますが中身は何もありません。
何度かlinq to sqlを作成していましてそのプロジェクトは正常に動きます。
今回あるプロジェクトで同じような現象が出ましたので、テスト的に新しいプロジェクトを作成して同じ現象を確認しました。
なんでしょうね。
-
webサイトプロジェクトの確認がよくわからないので再度プロジェクトを作成してみました。
テンプレートでVisual Basicーwebで名前をtestspread3としました。App_codeフォルダーを追加して追加でLinq to SQL
クラスを選んで名前をDataClasses1として作成したDataClasses1.Designer.vbのソースを見ると
imports System.data.linqとimports system.data.linq.mappingが緑色の波線でimports文は不要
そして次の文がエラーになっています。
<Global.System.Data.Linq.Mapping.DatabaseAttribute(Name:="membership")> _
Partial Public Class DataClasses1DataContext
Inherits System.Data.Linq.DataContext
Private Shared mappingSource As System.Data.Linq.Mapping.MappingSource = New AttributeMappingSource()
1行目でGlobal.System.Data.Linq.Mapping.DatabaseAttributeのところに型が定義されてません。プロパティNameが見つかりません。2行目でSystem.Data.Linq.DataContext型が定義されてませんとなる。
ここからすでにおかしいですね。前に書いた正常に見えるとは、ここで修正内容に従ってlinq.vbを追加したためかな?
以上からするとどこかで作成方法が間違えたかな。すみませんがよろしく教えてください。
-
> テンプレートでVisual Basicーwebで
それはこれ ↓ ですか?(VS2010 のものですが)
であれば、Web アプリケーションプロジェクトで作っているはずです。
Visual Studio で[ファイル(F)]⇒[新しいプロジェクト(P)...]⇒・・・という手順で作るのが Web アプリケーションプロジェクト、[ファイル(F)]⇒[新しい Web サイト(W)...]⇒・・・という手順で作るのが Web サイトプロジェクトです。
ご自分がどちらを作っているか、よく確認してください
Web アプリケーションプロジェクトだとすると、2 重コンパイルの問題があるため、App_Code フォルダは使いません。(MVC の HTML ヘルパーは例外)
またフォルダ名が名前空間に含まれてきますので、そのあたりに注意が必要です。
例えば WebApplication1 という名前のアプリケーションルート直下に NewFolder1 という名前のフォルダを作り、その中に Class1.cs というクラスファイルを作った場合、Class1 クラスの名前空間は WebApplication1.NewFolder1 になります(VB の場合も多分同じかと)。
名前空間の問題が最初の質問にあった型が定義されてないというエラーの原因かもと想像していましたが、そういうことはないですか? それ以前の問題がありそうですが、そこのところも確認してください。
それ以前の問題というのは、
> imports System.data.linqとimports system.data.linq.mappingが緑色の波
というところですが、参照設定に問題がありそうです。Web アプリケーションプロジェクトならソリューションエクスプローラーで「参照設定」の一覧を見ることができるはずですが、その中に System.Data.Linq は含まれているでしょうか?
#Web アプリケーションプロジェクトと Web サイトプロジェクトの違いは以下の記事を見てください。Web アプリケーション プロジェクトと Web サイト プロジェクト
https://msdn.microsoft.com/ja-jp/library/dd547590(v=vs.100).aspx- 編集済み SurferOnWww 2016年8月23日 3:56 一部訂正
-
終わりにしたのですが、その後この件で調べていたらちょうどこの件に関するページが見つかりました。
linq to sqlを入れたときに問題が出るとか歴史的な経過もありこれを見て理解しましたので後世のため記載しました。
結局webサイトのつもりでapp_codeフォルダーにlinq to sqlを作成したためこれを読み込めないのが原因だったとおもいます。(再度作成して確かめました)webアプリケーションでlinq to sqlは直下に作成」しなければならなかったのです。またwebアプリケーションはビルドしてbinいかにdllを作ってからでないといけないこともわかりました。(デバッグ実行ではビルドされて実行するため、気づくのが遅れていました。)webサイトはソースをなおせばビルドしなくても実行時にビルドされているのです。
詳しくはどっとねっとふぁんのページです。
- 編集済み なっちゃん 2016年8月24日 6:18 追加
-
誤解があるかもしれないと思いましたので、少し捕捉させてください。
> linq to sqlを入れたときに問題が出るとか歴史的な経過もありこれを見て理解しましたので
> 後世のため記載しました。参照されていたどっとねっとふぁんさんのブログの記事を拝見しました。
Web アプリケーションプロジェクトの場合、LINQ to SQL のクラスファイル .Designer.vs はビルドして .dll を作っておかないと、Visual Studio のデザイナで LinqDataSource を設定する際、デザイナがクラスファイルに定義されたクラスを認識しないということを言っていますね。
それは LINQ to SQL に限った話ではなく(一例として挙げただけ)、従来から ASP.NET Web Forms アプリで良く使われている型付 DataSet + TableAdapter と ObjectDataSource などの場合も同じで、ビルドしないと Visual Studio のデザイナは認識しないということは理解されているでしょうか?
また、それと今回の質問者さんの一番最初の質問にあった問題、
> そして新規にtest.aspxを作成してtest.aspx.vbのPage_Loadに
> dim db as new DataClasses1DataContextとすると型が定義されてないとエラーになりますとは違う話ということは理解されているでしょうか?
.Designer.vb がきちんとできていれば、ビルドしなくても Page_Load のコードで DataClasses1DataContext は認識され、エラーは出ないはずです。
ただし、App_Code にクラスファイルを作ると話は少々違ってくるのですが。
> 結局webサイトのつもりでapp_codeフォルダーにlinq to sqlを作成したためこれを読み込めないのが原因
> だったとおもいます。(再度作成して確かめました)Web アプリケーションプロジェクトでは App_Code フォルダのクラスファイルのビルドアクションは「コンテンツ」になります(たぶん 2 重コンパイルの問題を避けるための Visual Studio の配慮)。これが質問者さんが試した時 Page_Load で DataClasses1DataContext が認識されなかった原因だと思います。
ちなみに、ビルドアクションをコンパイルに変更して、名前空間名に App_Code を加えれば Page_Load のコードで認識されるはずです。(2 重コンパイルの問題があるのでそういうことをすべきではないのですが。そもそも、Web アプリケーションプロジェクトで App_Code フォルダを使うのは避けるべき)
> webアプリケーションでlinq to sqlは直下に作成」しなければならなかったのです。
必ずしもアプリケーションルート直下に作らなければならないということはないです。
上の画像を見てください。NewFolder1 に作ったクラスファイルはビルドアクションがコンパイルになり、Page_Load で名前空間に NewFolder1 を含めれば問題なく認識されています。
- 編集済み SurferOnWww 2016年8月24日 10:20 一部訂正