none
定義されてませんとなる。 RRS feed

  • 質問

  • 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の項目が出てくるはずですがでてきません。(定義されてませんとでるので当然でしょうが)

    なぜこのクラスが使えないのでしょうか、ほかのプロジェクトでは何回も作っているのですが。

    2016年8月22日 6:34

回答

  • レスが前後してしまいました。

    > 今調べてみたら、プロジェクトの参照にsystem.data.linq.mappingがありませんでした。
    > これでいいのでしょうか?

    参照設定に System.Data.Linq が含まれていれば OK なはずです。VS2010, ASP.NET 4, C# で作った .designer.cs ですが、以下のようになります。もちろん型が定義されてないという問題は出ません。

     

    2016年8月23日 3:35

すべての返信

  • 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 ファイルを開いて中身を調べてください。

    2016年8月22日 9:20
  • 作成方法はこのリンク(https://msdn.microsoft.com/ja-jp/library/bb907587(v=vs.100).aspx)通りに作成しています。

    .designer.vbは出来ていて正常にみえます。

    またDataClasses1.vbというのもできていますが中身は何もありません。

    何度かlinq to sqlを作成していましてそのプロジェクトは正常に動きます。

    今回あるプロジェクトで同じような現象が出ましたので、テスト的に新しいプロジェクトを作成して同じ現象を確認しました。

    なんでしょうね。

    2016年8月23日 0:37
  • 先の私のレスの質問、

    > Web サイトプロジェクトで Visual Studio のデザイナを利用して、以下の記事のような手順で、
    > .dbml ファイルを App_Code フォルダ下に作ったという理解でいいですか?

    に答えてください。特に「Web サイトプロジェクト」という理解でいいのかが重要。

    2016年8月23日 1:13
  • 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を追加したためかな?

    以上からするとどこかで作成方法が間違えたかな。すみませんがよろしく教えてください。

    2016年8月23日 2:21
  • 今調べてみたら、プロジェクトの参照にsystem.data.linq.mappingがありませんでした。

    これでいいのでしょうか?

    そしてsystem.data.linq.mappingを追加しようとしてもsystem.data.linqはありますが、~.mappingはありませんでした。

    これ殿いいのでしょうか?

    2016年8月23日 2:55
  • > テンプレートで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 一部訂正
    2016年8月23日 3:21
  • レスが前後してしまいました。

    > 今調べてみたら、プロジェクトの参照にsystem.data.linq.mappingがありませんでした。
    > これでいいのでしょうか?

    参照設定に System.Data.Linq が含まれていれば OK なはずです。VS2010, ASP.NET 4, C# で作った .designer.cs ですが、以下のようになります。もちろん型が定義されてないという問題は出ません。

     

    2016年8月23日 3:35
  • 回答としてマークの解除したら、最後の投稿が出来なくなりましたので結論を再度投稿します。

    webアプリケーションとして作成していてためこの問題が起きました。

    webサイトとして作成し直したところ想定通りとなりました。

    SurferOnWwwさんにはご迷惑かけました。

    webサイトとwebアプリケーションの作成で確認方法は

    MY Projectフォルダーができていればwebアプリケーションであると判断すべきでした。

    (独り言:なんで2つのプロジェクトがあるんでしょうかね?)

    ありがとうございます。

    2016年8月23日 4:52
  • > webアプリケーションとして作成していてためこの問題が起きました。
    > webサイトとして作成し直したところ想定通りとなりました。

    真の原因は「webアプリケーションとして作成していてため」ではなくて、参照設定の不足と名前空間の理解あたりにあったと思います。

    Web アプリケーションプロジェクトでも Web サイトプロジェクトでも、どちらでも問題なく .dbml ファイルや .designer.vb ファイルは作成できます。

    余計なお世話かもしれませんが、今後のためにきちんと原因を把握しておくことをお勧めします。

    2016年8月23日 6:24
  • 私はwebサイトしか作成しないのでいいのですが、独り言に書いたようになぜ2つ必要なのか勉強不足のためわかりません。

    なお参照設定も名前空間も目を皿のようにしてみましたがわかりませんでした。

    確かにwebアプリケーションでVSが作成したクラスがエラーになっているのですから、この指摘もただしいとおもいます。

    取りあえず終わりにしたいとおもいます。

    2016年8月23日 7:29
  • 終わりにしたのですが、その後この件で調べていたらちょうどこの件に関するページが見つかりました。

    linq to sqlを入れたときに問題が出るとか歴史的な経過もありこれを見て理解しましたので後世のため記載しました。

    結局webサイトのつもりでapp_codeフォルダーにlinq to sqlを作成したためこれを読み込めないのが原因だったとおもいます。(再度作成して確かめました)webアプリケーションでlinq to sqlは直下に作成」しなければならなかったのです。またwebアプリケーションはビルドしてbinいかにdllを作ってからでないといけないこともわかりました。(デバッグ実行ではビルドされて実行するため、気づくのが遅れていました。)webサイトはソースをなおせばビルドしなくても実行時にビルドされているのです。

    詳しくはどっとねっとふぁんのページです。

    https://blogonos.wordpress.com/2008/01/21/web%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%A8web%E3%82%B5%E3%82%A4%E3%83%88%E3%83%97%E3%83%AD%E3%82%B8/


    2016年8月24日 5:38
  • 誤解があるかもしれないと思いましたので、少し捕捉させてください。

    > 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 一部訂正
    2016年8月24日 8:40
  • 勉強になります。ビルドアクションなど触ったこともなかったのですが今回の件で少しは理解しました。

    ありがとうございます。

    2016年8月24日 23:55