4

ローカルで完全に機能するWebプロジェクトがあります。しかし、Azureで公開されているWebサイトの接続文字列を変更してSQL Azureのデータベースに接続すると、このエラーが発生し始めます。

System.Data.Entity.Infrastructure.UnintentionalCodeFirstException: Code generated using the T4 templates for Database First and Model First development may not work correctly if used in Code First mode. To continue using Database First or Model First ensure that the Entity Framework connection string is specified in the config file of executing application. To use these classes, that were generated from Database First or Model First, with Code First add any additional configuration using attributes or the DbModelBuilder API and then remove the code that throws this exception.
   at MyClass.OnModelCreating(DbModelBuilder modelBuilder) in c:\a\src\MyProject\Model.Context.cs:line 25
   at System.Data.Entity.Internal.LazyInternalContext.CreateModelBuilder()
   at System.Data.Entity.Internal.LazyInternalContext.CreateModel(LazyInternalContext internalContext)
   at System.Data.Entity.Internal.RetryLazy`2.GetValue(TInput input)
   at System.Data.Entity.Internal.LazyInternalContext.InitializeContext()
   at System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType)
   at System.Data.Entity.Internal.Linq.InternalSet`1.Initialize()
   at System.Data.Entity.Internal.Linq.InternalSet`1.get_InternalContext()
   at System.Data.Entity.Infrastructure.DbQuery`1.System.Linq.IQueryable.get_Provider()
   at System.Linq.Queryable.Select[TSource,TResult](IQueryable`1 source, Expression`1 selector)

私の構成には次のものがあります。

<connectionStrings>
    <add name="MyDBEntities" connectionString="metadata=res://*/MyModel.csdl|res://*/MyModel.ssdl|res://*/MyModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;Server=tcp:[Removed].database.windows.net,1433;Database=MyDB;User ID=[Removed];Password=[Removed];Trusted_Connection=False;Encrypt=True;Connection Timeout=30;&quot;" providerName="System.Data.EntityClient" /> 
    <add name="MyDB" connectionString="metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provider=System.Data.SqlClient;provider connection string=&quot;Server=tcp:[Removed].database.windows.net,1433;Database=MyDB;User ID=[Removed];Password=[Removed];Trusted_Connection=False;Encrypt=True;Connection Timeout=30;&quot;" providerName="System.Data.EntityClient" />
</connectionStrings>

その接続文字列を使用してローカルで単体テストを使用してテストしました。これは、SQLAzureデータベースに接続しているローカルマシンから機能します。助けていただければ幸いです。

4

1 に答える 1

16

私は今日この正確な問題を抱えていました。Azureにデプロイするのは初めてです。髪の毛が残っていないことを除けば、髪を抜いてきました。 私はついにそれを理解しました、そしてそれはおそらくここのオリジナルのポスターが持っているのと同じ問題です。

元のポスターと同じように、次の構成でテストしました。

  • VisualStudioからローカルDBに対してWCFWebアプリを実行しました-成功
  • VisualStudioからローカルIISにWCFWebアプリを展開し、ローカルDBに対して実行-成功
  • VisualStudioからAzureSQLDBに対してWCFWebアプリを実行しました-成功
  • Visual Studioを介してWCFアプリをAzureにデプロイし、AzureSQLDBに対して実行-失敗!!

別の投稿(コードファーストとデータベースファースト)を読んだ後、ヒントを得ました。その投稿によると、「接続文字列にメタデータがある場合、EFはそれがモデルファーストまたはデータベースファーストであると見なします」が、「プレーン接続文字列である場合、EFはそれがコードファーストであると見なします」。デプロイされたAzureWebサイトのweb.configを参照し、接続文字列にModel-Firstメタデータへの適切な参照があることを確認しました。それで、何が問題でしたか?

おそらく、AzureWebサイトがweb.configの接続文字列を読み取っていないと思いました。Azure Webサイトを作成した方法を振り返ると、Web.configの接続文字列の「ラベル」とまったく同じ名前のエイリアスをAzureSQLDBに指定したことを思い出しました。 明確にするために:

  • Azure管理コンソールで、Webサイトの設定に移動し、作成の副作用としてAzureWebサイトに「ベイクイン」された「接続文字列」設定を確認しました-website-with-DB--接続文字列「ハンドル」は「 SsnCustInfoModelContainer"-接続文字列のweb.config'handle'と同じ'handle'/'alias'を接続に誤って指定しましたが、これが役立つと思いました。代わりに、EFが接続文字列を検索すると、この「エイリアス化された」ハンドルが見つかりました。これは、メタデータを含まない「プレーンな」SQL接続文字列でした。この「エイリアス」は、web.configで指定された実際の接続文字列をマスクしました。

そのため、AzureSQLDBとAzureWebサイトを破棄しました。次に、Azure Webサイトを再作成しましたが、今回は、関連付けられたAzureSQLServerへの接続用に「SsnCustInfoModelContainer_Proto」の接続文字列「alias」を要求しました。ローカルのSQLServerManagementStudioからAzureSQLDBを初期化した後、WCFWebアプリをAzureWebサイトに再度展開し(もちろん、これを行うには新しい展開プロファイルをダウンロードする必要がありました)、アプリを再試行しました。今回は機能しました。「エイリアス」「SsnCustInfoModelContainer_Proto」はEFと競合せず、EFによって検出されませんでした。代わりに、EFは、web.configで、すべての適切なメタデータを含む真の接続文字列を見つけました。 問題が解決しました。

于 2013-04-07T04:10:30.180 に答える