web-dev-qa-db-ja.com

足場コントローラーがVisual Studio 2013 Update 2で機能しない

問題:

Visual Studio 2013 Update 2に更新しましたが、コントローラーをスキャフォールドできません。

問題はプロジェクト固有のものではありません。コントローラーをスキャフォールドしようとすると、すべてのプロジェクトで次のエラーが発生します。

There was an error running the selected code generator:
'Exception has been thrown by the target of an invocation.'

Visual Studio 2013 update 2に更新する前に機能していました。

問題をグーグルで死に至らしましたが、さまざまな提案が機能しません

例えば:

  1. 私のコンテキストでOnModelCreatingをコメントアウトします。

  2. MvcScaffoldingなどのパッケージを削除します(何もインストールしておらず、どのプロジェクトでも動作しません)。

テンプレートの一部を変更/カスタマイズしましたが、変更後に機能していました。

編集:

Visual Studio 2013 Update 2をアンインストールしたため、Visual Studioバージョン12.0.21005.1 RELに戻りました。

問題はなくなりました。したがって、Update 2の問題は非常に明確です。

質問:

誰か(Microsoftを含む)が修正を知っていますか?

編集2:

Farruk Subhaniの答えはこの問題に対処していません。この質問は、MVCScaffoldingへの参照を削除しても問題が解決しないことを明確に述べています。

200ポイントの賞金を追加しました。明確に述べられているように質問に答えてください。

65
awrigley

物事の組み合わせは私のために働いています:

  1. Visual Studio 2013 Update 3にアップグレードします。

  2. Entity Frameworkを6.1.1にアップグレードします

  3. DbSet <...>の代わりにIDbSet <...>を使用するようにコンテキスト構成を変更します(これは非同期アクションの使用に影響する可能性があると聞きましたが、ログインアクションなどで使用するため、明らかに私の場合ではありません。 ASP.NET Identity 2サンプルNugetパッケージで提供されます)。

この組み合わせがうまく機能する理由はまったくわかりません。しかし、その後、MSからの雷の沈黙を考えると、私はおそらく一人ではありません。アップデート2が機能しなかったと思います...

12
awrigley

何も機能しないという皆さんにとって、本当の答えは、web.configにconfigSourceがあり、接続文字列をインライン化する必要があるANYTHINGを削除する必要があるということです。

編集:

誰かが、configSource属性を使用しない<configSettings><appSettings>、および<connectionStrings>タグのみである必要があると指摘しました。また、リライタタグなど、他の場所でconfigSource属性を使用できることも確認しました。

ツールは、接続文字列やアプリケーション設定など、使用するもののconfigSourceの場所を追跡できないと思います。

マイクロソフトは、まだ修正されていない場合、この問題を解決する必要があります。

編集2:

@awrigleyは彼の答えを正しいとマークしたとさえ考えており、それはVisual Studioの既知のバグです。私はその時何とか伝えました、そして、それはすぐにいくらかの注目を集めると思います。 https://github.com/aspnet/Tooling/issues/169#issuecomment-144197015

35
regisbsb

ソリューション

セクションを確認してください

<connectionStrings>..</connectionStrings>

is after

<configSections>..</configSections>
6
Moji

Package Manager Consoleで次のコマンドを実行してください:

Uninstall-Package EntityFramework -Force

Install-Package EntityFramework

Uninstall-Package  MvcScaffolding

Install-Package MvcScaffolding
4
SKB

Visual Studio 2013 Update 3でもまったく同じ問題がありましたが、Entity Frameworkで動作するスキャフォールダーのみでした。この問題は、Entity Framework 6.1.0とVisual Studio 2013 Update 2以降のscaffoldとの非互換性が原因のようです。

EFをアップグレードするには、次の手順を実行します。

Uninstall-Package EntityFramework -Force

インストールパッケージEntityFramework

この回答は here から引用されています

アップグレード後、足場は正常に機能しています。 Entity Frameworkが必要なすべてのプロジェクトに必ず新しいバージョンをインストールしてください。

3
The Victor

私はVS 2013 Update 4を使用していますが、まったく同じ問題があります。接続文字列を外部ファイルからweb.configに移動するときに機能します。したがって、scaffoldingの際にconnectionStringのconfigureSource属性を使用しないようにすることができると思います。

変更前と変更後の私のweb.config

<connectionStrings configureSource="connectionStrings.config/>

後:

<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.Microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>
  <log4net configSource="log4net.config" />
  <connectionStrings>
    <clear/>
    <add name="DefaultConnection" connectionString="Data Source=.;Initial Catalog=YourDb;Integrated Security=False;User ID=sa;Password=YourPassword!#;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" />
  </connectionStrings>
2
Dung Le

私は、問題はweb.configファイルの不適切な構成によるものだと思います。

私の場合、web.configに複数の<entityFramework>セクションがあり、構成を変更すると問題は解決しました。

2
Dipen Shah

これは便利ですscaffolding nugetパッケージをインストールしていない人向けソリューションで。

実際、mvcscaffoldingまたはt4scaffoldingをインストールしておらず、同じエラーメッセージが表示されました。

私の場合、問題/バグの原因は接続文字列の変更です。

ここに私が持っていた/再現するステップがあります。

  • Visual Studio 2013 Community Editionをインストールしました
  • 作成されたMVCプロジェクト
  • 作成されたコードファーストモデル
  • 次のように、実サーバーに接続するための接続文字列を編集しました。

    <add name="DefaultConnection"
         connectionString="server=myserv;database=MyCustomerDB;user id=myuser;password=mypass" 
         providerName="System.Data.SqlClient" />
    

次に、次のように、nugetを使用して移行を有効にしました。

  • 移行の有効化
  • Add-Migration InitialCreate
  • データベースを更新する
  • ウェブサイトを開始し、ユーザーを登録できました。すべてのテーブルが正しく作成されました。

次に、scaffoldingオプションを使用してコントローラーを作成しました。

  • [コントローラー]> [追加]> [コントローラー...]を右クリックし、Entity Frameworkを使用してビューを持つMVC 5コントローラー>使用するコンテキストとクラスを選択しました。動いた。

それから、コードを最初に変更して、ゼロから始めることにしました。

  • localdbを使用するために、接続文字列を次のように変更しました。

    <add name="DefaultConnection" 
         connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\aspnet-Test-20141126094523.mdf;Initial Catalog=aspnet-Test-20141126094523;Integrated Security=True"
         providerName="System.Data.SqlClient" />
    

それから私は続けました:

  • 移行フォルダを削除しました
  • nugetコンソールで上記と同じコマンドを使用して移行を再度有効にします
  • ウェブサイトを開始し、ユーザーを登録しました
  • mdf dbを確認しました。すべてのテーブルが存在するため、接続文字列が機能します。
  • エンティティフレームワークを使用して、[コントローラー]> [追加]>コントローラー...>ビュー付きMVC 5コントローラーを右クリックします。使用するコンテキストとクラスを選択しました。動作せず、次のポップアップエラーが表示されました。

選択したコードジェネレーターの実行中にエラーが発生しました: '呼び出しのターゲットによって例外がスローされました。'

解決策:

いくつかの調査の後、私がやったことは、web.configの接続文字列を(localdbではなく)「実サーバー」への最初の接続文字列に戻すことです。ビュー付きのコントローラーを再度生成しようとしました。動いた!

だから、私には接続文字列の問題/バグまたはlocaldbの問題のようです...それを説明することはできません。 Visual Studioが私がしたことを気に入らないのかもしれませんが、古い接続文字列を保持する必要がありました...

とにかく、足場が必要になったら、接続文字列を機能するものに変更するだけです。次に、自分のWebサイトをテストするために、localdbに戻します。

2
firepol

ここでは英語でもう少し説明するので、誰でも理解できます。これが誰にも役立つことを願っていますこれは、Visual Studioがデータベースモデルに接続できないために発生します。

これは、DbContextを拡張するクラスの名前やパスを変更し、Web.configファイル(プロジェクトの最も外側の部分:ルート)で変更しなかった場合に発生します。

例:

DbContextコードを足場にしたと想像してください:

a)プロジェクト内のフォルダーを右クリックして「ADO.NET Entity Data Model」を追加し、「Model1」という名前を付けました

次のコードを取得します。

  public class Model1 : DbContext
{
    // Your context has been configured to use a 'Model1' connection string from your application's 
    // configuration file (App.config or Web.config). By default, this connection string targets the 
    // 'Skelleton.Models.Model1' database on your LocalDb instance. 
    // 
    // If you wish to target a different database and/or database provider, modify the 'Model1' 
    // connection string in the application configuration file.
    public Model1()
        : base("name=Model1")
    {
    }

    // Add a DbSet for each entity type that you want to include in your model. For more information 
    // on configuring and using a Code First model, see http://go.Microsoft.com/fwlink/?LinkId=390109.

    // public virtual DbSet<MyEntity> MyEntities { get; set; }
}

enter image description here

b)今、あなたが書いた名前は明らかに悪いと判断したので、それをAppContextに変更します

コードは次のようになります。

  public class AppContext : DbContext
{
    // Your context has been configured to use a 'AppContext' connection string from your application's 
    // configuration file (App.config or Web.config). By default, this connection string targets the 
    // 'Skelleton.Models.AppContext' database on your LocalDb instance. 
    // 
    // If you wish to target a different database and/or database provider, modify the 'AppContext' 
    // connection string in the application configuration file.
    public AppContext()
        : base("name=AppContext")
    {
    }

    // Add a DbSet for each entity type that you want to include in your model. For more information 
    // on configuring and using a Code First model, see http://go.Microsoft.com/fwlink/?LinkId=390109.

    // public virtual DbSet<MyEntity> MyEntities { get; set; }
}

enter image description here

次に、ビューでCRUD(作成、読み取り、更新、削除)操作を足場にしようとすると失敗します!

enter image description here

何故ですか?

さて、web.configファイルに移動すると、次の文字列が表示されます。

 <add name="Model1" connectionString="data source=(LocalDb)\v11.0;initial catalog=Skelleton.Models.Model1;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />

(この行は通常<add name="DefaultConnection"の下にあります)

enter image description here そして、問題のある場所があります。与えた名前のModel1を変更する必要があります!

この場合、「Model1」ではなく「AppContext」と表示する必要があります

そしてそれが言うところ:

initial catalog=Skelleton.Models.Model1;

それを確認する:

  1. クラスを持つ.csファイルの名前です

  2. 名前空間(またはクラスの名前の前にある一連の名前(ドット区切り))は正しい名前です。 「.cs」拡張子を最後に追加しないことに注意してください。ファイルの名前だけ。

次のようになります。 enter image description here

クラスの名前を内部的にも外部的にも変更し(内部とファイル名)、notの場所を変更したため、クラスの名前をAppContextに変更しました。

これが行われた後。通常は足場できます;)

お役に立てれば!

2
Jose A

私の場合、web.configの接続文字列の問題を解決しました。

前の問題

  <connectionStrings configSource="Configs\ConnectionString.config"/>

理由はわかりませんが、vsはデータベースに接続できず、失敗します。

変更後

<connectionStrings>
    <add name="UIBuilderContext" connectionString="metadata=res:/ ..... " />
  </connectionStrings>

そしてそれは動作します

2
Math

私にとっては、<configSettings><appSettings>、および<connectionStrings>タグがではなくであり、configSource属性を使用する必要がありました。

configSourceタグなど、他の場所でrewriter属性を使用できました。

2
Cord Rehn

この問題を解決するために以下を実行しました。

  1. パッケージマネージャーで、MVCScffoldingまたはT4Scaffoldingがあるかどうかを確認します(vs2013のコアまたはプレリリース)
  2. MVCScaffoldingまたはT4Scaffoldingのいずれかに依存するすべてのパッケージをアンインストールします
  3. CodeTemplatesフォルダーを完全にコピーします(カスタムテンプレートを置き換えないでください。このフォルダーのルートから残りのファイルがあることを確認してください。いくつかのテンプレートをカスタマイズして、このフォルダーの場所がわかるようにします)
  4. プロジェクトをビルドして閉じます。
  5. 管理者モードでVisual Studioを再起動します
  6. パッケージマネージャーコンソールを開きます(エラーがないはずです。PM>がエラーなしで表示されます。
  7. Controllerフォルダーを右クリックして、Add-> New Scaffolding Itemを選択するか、Add-> Controllerを選択して、どちらを選択するかを選択し、MVC5 scaffoldまたはリストに表示されるものを選択します。
  8. コントローラでDBContextやリポジトリなどを選択する必要がある場合は、パラメータを選択できます。

これにより、コントローラーと関連ビューが作成されました。

そのフォルダーにQuickViewという名前のカスタムパーシャルビューを追加しましたが、このスキャフォールディングプロシージャはそれを考慮せず、デフォルトで実行しているビューのみを生成しました。これらのカスタムビューをファイルに追加してScaffolderにそれらを生成するように指示する必要があるかどうかはわかりません。

1
Farrukh Subhani

私はVS 2015RCをファイナルカットの前の最後のもので走らせています。ここでソリューションを割引しないでください。私のソリューションはナゲットパッケージマネージャーの下にあり、Microsoft.Aspnet.Mvc 5.2.3パッケージを更新して、問題を修正しました。 VS 2015を使用しているすべての人に役立つことを願っています。

0
RockingCoder

アップデート4でも同じ問題が発生しました。セクション名が定義されていない<configSections></configSections>が原因であることがわかりました。タグ間に挿入した修正は次のとおりで、すべてのエラーが修正されました。

<section name="entityFramework" 
         type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, 
               EntityFramework, Version=6.0.0.0, Culture=neutral, 
               PublicKeyToken=b77a5c561934e089" requirePermission="false" />

プロジェクトをビルドすると、すべてが機能するはずです。乾杯!

0
RyanH

私はInitializerを使用し、DbContextコンストラクタからInitializerを削除/コメントすると、足場はうまく機能します

public myDbContext () : base("name=DefaultConnection")
    {

        //Database.SetInitializer(new DropCreateDatabaseIfModelChanges<DastanakDbContext>());
        //Database.Initialize(true);
    }
0
AminM

私にとっては、web.configファイルの<configSections>ノードが<configuration>ノードの直後の最初のノードであることを確認することが効果的でした。

最初にconnectionStringsを追加したとき、実際にconfigSectionsの前に配置していたため、Scaffoldツールが壊れていました。

足場が実行されて接続情報を取得しようとするとき、entityFrameworkノードのconfigセクションがすでに存在することを期待しているので、使用するDBプロバイダーがわかりますが、configSectionsの前に接続文字列があったとき、それはわかりませんでしたLocalDBを使用する(これは私のconn文字列が使用していたものです)。

0
Thiago Silva