SQL Server 2012 の AdventureWorks MDF ファイル (ファイルの名前は AdventureWorks2012_Data.mdf) を格納している Visual Studio 2012 に単体テスト プロジェクトがあります。Visual Studio サーバー エクスプローラーでは、データ接続に MDF を追加してデータベースを参照できます。$/Data Connections/AsventureWorks2012_Data.mdf を右クリックしてプロパティを選択すると、次のように接続文字列にアクセスできます。
データ ソース=(LocalDB)\v11.0;AttachDbFilename=C:\Projects\Common\Source\Framework\Framework.Data.Tests\AdventureWorks2012_Data.mdf;統合セキュリティ=True;接続タイムアウト=30
次のように、これを app.config ファイルの Entity Framework 接続文字列にコピーしました。
<!-- Works :-) -->
<connectionStrings>
<add name="AdventureWorksEntities"
connectionString="metadata=res://*/Repository2Tests.AdventureWorks.csdl|res://*/Repository2Tests.AdventureWorks.ssdl|res://*/Repository2Tests.AdventureWorks.msl;provider=System.Data.SqlClient;provider connection string="Data Source=(LocalDB)\v11.0;AttachDbFilename=C:\Projects\Common\Source\Framework\Framework.Data.Tests\AdventureWorks2012_Data.mdf;Integrated Security=True;Connect Timeout=30App=EntityFramework""
providerName="System.Data.EntityClient" />
</connectionStrings>
AttachDbFilename には、MDF ファイルのフル パスが C:\Projects\Common\Source\Framework\Framework.Data.Tests\AdventureWorks2012_Data.mdf として含まれていることに注意してください。
単体テストを実行すると、すべてが期待どおりに問題ありません。
「 ADO.NET Entity Framework 接続文字列」で説明されているように、AttachDbFilename を |DataDirectory|\AdventureWorks2012_Data.mdf に変更し、「 ADO.NET |DataDirectory| どこに文書化されていますか? 」で説明されているように DataDirectory を設定しました。以下のとおりであります:
<!-- Doesn't work :-( -->
<connectionStrings>
<add name="AdventureWorksEntities"
connectionString="metadata=res://*/Repository2Tests.AdventureWorks.csdl|res://*/Repository2Tests.AdventureWorks.ssdl|res://*/Repository2Tests.AdventureWorks.msl;provider=System.Data.SqlClient;provider connection string="Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\AdventureWorks2012_Data.mdf;Integrated Security=True;Connect Timeout=30;App=EntityFramework""
providerName="System.Data.EntityClient" />
</connectionStrings>
|DataDirectory| の使用への変更 次の実行時エラーが発生しました:
System.Data.EntityException: The underlying provider failed on ConnectionString. ---> System.ArgumentException: URI formats are not supported.
HResult: -2147024809
at System.IO.Path.NormalizePath(String path, Boolean fullCheck, Int32 maxPathLength)
at System.IO.Path.GetFullPath(String path)
at System.Data.Common.ADP.GetFullPath(String filename)
at System.Data.Common.DbConnectionOptions.ExpandDataDirectory(String keyword, String value, String& datadir)
at System.Data.SqlClient.SqlConnectionString..ctor(String connectionString)
at System.Data.SqlClient.SqlConnectionFactory.CreateConnectionOptions(String connectionString, DbConnectionOptions previous)
at System.Data.ProviderBase.DbConnectionFactory.GetConnectionPoolGroup(DbConnectionPoolKey key, DbConnectionPoolGroupOptions poolOptions, DbConnectionOptions& userConnectionOptions)
at System.Data.SqlClient.SqlConnection.ConnectionString_Set(DbConnectionPoolKey key)
at System.Data.SqlClient.SqlConnection.set_ConnectionString(String value)
at System.Data.EntityClient.EntityConnection.ChangeConnectionString(String newConnectionString)
--- End of inner exception stack trace ---
HResult: -2146233087
at System.Data.EntityClient.EntityConnection.ChangeConnectionString(String newConnectionString)
at System.Data.Entity.Internal.LazyInternalConnection.TryInitializeFromAppConfig(String name, ConnectionStringSettingsCollection connectionStrings)
at System.Data.Entity.Internal.LazyInternalConnection.Initialize()
at System.Data.Entity.Internal.LazyInternalConnection.get_ConnectionHasModel()
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.Internal.Linq.InternalSet`1.Create()
私はこれを数日間調査しましたが、無数のバリエーションを試しましたが成功しませんでした. Microsoft コードをデバッグしましたが、コンパイラの最適化により、スタックにデバッグ情報が表示されません。
この特定の問題に遭遇した人はいますか?