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に更新する前に機能していました。
問題をグーグルで死に至らしましたが、さまざまな提案が機能しません
例えば:
私のコンテキストでOnModelCreatingをコメントアウトします。
MvcScaffoldingなどのパッケージを削除します(何もインストールしておらず、どのプロジェクトでも動作しません)。
テンプレートの一部を変更/カスタマイズしましたが、変更後に機能していました。
Visual Studio 2013 Update 2をアンインストールしたため、Visual Studioバージョン12.0.21005.1 RELに戻りました。
問題はなくなりました。したがって、Update 2の問題は非常に明確です。
誰か(Microsoftを含む)が修正を知っていますか?
Farruk Subhaniの答えはこの問題に対処していません。この質問は、MVCScaffoldingへの参照を削除しても問題が解決しないことを明確に述べています。
200ポイントの賞金を追加しました。明確に述べられているように質問に答えてください。
物事の組み合わせは私のために働いています:
Visual Studio 2013 Update 3にアップグレードします。
Entity Frameworkを6.1.1にアップグレードします
DbSet <...>の代わりにIDbSet <...>を使用するようにコンテキスト構成を変更します(これは非同期アクションの使用に影響する可能性があると聞きましたが、ログインアクションなどで使用するため、明らかに私の場合ではありません。 ASP.NET Identity 2サンプルNugetパッケージで提供されます)。
この組み合わせがうまく機能する理由はまったくわかりません。しかし、その後、MSからの雷の沈黙を考えると、私はおそらく一人ではありません。アップデート2が機能しなかったと思います...
何も機能しないという皆さんにとって、本当の答えは、web.configにconfigSourceがあり、接続文字列をインライン化する必要があるANYTHINGを削除する必要があるということです。
編集:
誰かが、configSource属性を使用しない<configSettings>
、<appSettings>
、および<connectionStrings>
タグのみである必要があると指摘しました。また、リライタタグなど、他の場所でconfigSource属性を使用できることも確認しました。
ツールは、接続文字列やアプリケーション設定など、使用するもののconfigSourceの場所を追跡できないと思います。
マイクロソフトは、まだ修正されていない場合、この問題を解決する必要があります。
編集2:
@awrigleyは彼の答えを正しいとマークしたとさえ考えており、それはVisual Studioの既知のバグです。私はその時何とか伝えました、そして、それはすぐにいくらかの注目を集めると思います。 https://github.com/aspnet/Tooling/issues/169#issuecomment-144197015
ソリューション
セクションを確認してください
<connectionStrings>..</connectionStrings>
is after
<configSections>..</configSections>
Package Manager Consoleで次のコマンドを実行してください:
Uninstall-Package EntityFramework -Force
Install-Package EntityFramework
Uninstall-Package MvcScaffolding
Install-Package MvcScaffolding
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が必要なすべてのプロジェクトに必ず新しいバージョンをインストールしてください。
私は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>
私は、問題はweb.configファイルの不適切な構成によるものだと思います。
私の場合、web.configに複数の<entityFramework>
セクションがあり、構成を変更すると問題は解決しました。
これは便利ですscaffolding nugetパッケージをインストールしていない人向けソリューションで。
実際、mvcscaffoldingまたはt4scaffoldingをインストールしておらず、同じエラーメッセージが表示されました。
私の場合、問題/バグの原因は接続文字列の変更です。
ここに私が持っていた/再現するステップがあります。
次のように、実サーバーに接続するための接続文字列を編集しました。
<add name="DefaultConnection"
connectionString="server=myserv;database=MyCustomerDB;user id=myuser;password=mypass"
providerName="System.Data.SqlClient" />
次に、次のように、nugetを使用して移行を有効にしました。
次に、scaffoldingオプションを使用してコントローラーを作成しました。
それから、コードを最初に変更して、ゼロから始めることにしました。
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" />
それから私は続けました:
選択したコードジェネレーターの実行中にエラーが発生しました: '呼び出しのターゲットによって例外がスローされました。'
解決策:
いくつかの調査の後、私がやったことは、web.config
の接続文字列を(localdbではなく)「実サーバー」への最初の接続文字列に戻すことです。ビュー付きのコントローラーを再度生成しようとしました。動いた!
だから、私には接続文字列の問題/バグまたはlocaldbの問題のようです...それを説明することはできません。 Visual Studioが私がしたことを気に入らないのかもしれませんが、古い接続文字列を保持する必要がありました...
とにかく、足場が必要になったら、接続文字列を機能するものに変更するだけです。次に、自分のWebサイトをテストするために、localdbに戻します。
ここでは英語でもう少し説明するので、誰でも理解できます。これが誰にも役立つことを願っていますこれは、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; }
}
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; }
}
次に、ビューでCRUD(作成、読み取り、更新、削除)操作を足場にしようとすると失敗します!
何故ですか?
さて、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"
の下にあります)
そして、問題のある場所があります。与えた名前のModel1を変更する必要があります!
この場合、「Model1」ではなく「AppContext」と表示する必要があります
そしてそれが言うところ:
initial catalog=Skelleton.Models.Model1;
それを確認する:
クラスを持つ.csファイルの名前です
名前空間(またはクラスの名前の前にある一連の名前(ドット区切り))は正しい名前です。 「.cs」拡張子を最後に追加しないことに注意してください。ファイルの名前だけ。
次のようになります。
クラスの名前を内部的にも外部的にも変更し(内部とファイル名)、notの場所を変更したため、クラスの名前をAppContextに変更しました。
これが行われた後。通常は足場できます;)
お役に立てれば!
私の場合、web.configの接続文字列の問題を解決しました。
前の問題
<connectionStrings configSource="Configs\ConnectionString.config"/>
理由はわかりませんが、vsはデータベースに接続できず、失敗します。
変更後
<connectionStrings>
<add name="UIBuilderContext" connectionString="metadata=res:/ ..... " />
</connectionStrings>
そしてそれは動作します
私にとっては、<configSettings>
、<appSettings>
、および<connectionStrings>
タグがではなくであり、configSource
属性を使用する必要がありました。
configSource
タグなど、他の場所でrewriter
属性を使用できました。
この問題を解決するために以下を実行しました。
これにより、コントローラーと関連ビューが作成されました。
そのフォルダーにQuickViewという名前のカスタムパーシャルビューを追加しましたが、このスキャフォールディングプロシージャはそれを考慮せず、デフォルトで実行しているビューのみを生成しました。これらのカスタムビューをファイルに追加してScaffolderにそれらを生成するように指示する必要があるかどうかはわかりません。
私はVS 2015RCをファイナルカットの前の最後のもので走らせています。ここでソリューションを割引しないでください。私のソリューションはナゲットパッケージマネージャーの下にあり、Microsoft.Aspnet.Mvc 5.2.3パッケージを更新して、問題を修正しました。 VS 2015を使用しているすべての人に役立つことを願っています。
アップデート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" />
プロジェクトをビルドすると、すべてが機能するはずです。乾杯!
私はInitializerを使用し、DbContextコンストラクタからInitializerを削除/コメントすると、足場はうまく機能します
public myDbContext () : base("name=DefaultConnection")
{
//Database.SetInitializer(new DropCreateDatabaseIfModelChanges<DastanakDbContext>());
//Database.Initialize(true);
}
私にとっては、web.configファイルの<configSections>
ノードが<configuration>
ノードの直後の最初のノードであることを確認することが効果的でした。
最初にconnectionStrings
を追加したとき、実際にconfigSections
の前に配置していたため、Scaffoldツールが壊れていました。
足場が実行されて接続情報を取得しようとするとき、entityFrameworkノードのconfigセクションがすでに存在することを期待しているので、使用するDBプロバイダーがわかりますが、configSectionsの前に接続文字列があったとき、それはわかりませんでしたLocalDBを使用する(これは私のconn文字列が使用していたものです)。