EF 4.1 と Mini-profiler 1.7 を使用。モデル優先を使用して、既存のデータベースからスキャンします。EF は、DbContext/DbSet ではなく、ObjectContext/ObjectSet から派生するクラスを生成します。それを制御する場所が見つかりませんでした。
一般的なソリューションを試しましたが、役に立ちませんでした。
欲求不満に苦しんで、ProfiledDbConnection で直接作成された明示的な EntityConnection を使用して Context を直接作成しようとしました。接続が意図したタイプではない可能性を回避したかったのです。
public HomeController() {
try {
string[] paths = new string[] { @"res://*/" };
Assembly[] assys = new Assembly[] { Assembly.GetExecutingAssembly() };
MetadataWorkspace mw = new MetadataWorkspace(paths, assys);
string cnx = WebConfigurationManager.ConnectionStrings["XXXX"].ConnectionString;
DbConnection cx = MvcMiniProfiler.Data.ProfiledDbConnection.Get(new SqlConnection(cnx), MiniProfiler.Current);
//DbConnection cx = Database.DefaultConnectionFactory.CreateConnection(cnx);
EntityConnection ec = new EntityConnection(mw, cx);
db = new MyContextEntities(ec);
}
catch (Exception ex) {
Trace.WriteLine("EDM failed: " + ex.Message);
db = new MyContextEntities();
}
}
正しいパスが選択されていることを確認しました。ただし、実際に LINQ クエリを実行すると、例外が発生します。
タイプ 'MvcMiniProfiler.Data.ProfiledDbConnection' のオブジェクトをタイプ 'System.Data.SqlClient.SqlConnection' にキャストできません。
問題のあるステートメントは次のとおりです。
return query.ToList();
スタック トレースはさらに興味深いものです。明らかに EF 内の何かが SqlConnection を絶対に必要としているからです。
System.Data.SqlClient.SqlCommand.set_DbConnection (DbConnection 値) で System.Data.Common.DbCommand.set_Connection (DbConnection 値) で System.Data.Common.Utils.CommandHelper.SetStoreProviderCommandState (EntityCommand entityCommand、EntityTransaction entityTransaction、DbCommand storeProviderCommand) でSystem.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands (EntityCommand entityCommand、CommandBehavior 動作) で System.Data.Objects.Internal.ObjectQueryExecutionPlan.Execute[TResultType] (ObjectContext コンテキスト、ObjectParameterCollection parameterValues) で System.Data.Objects.ObjectQuery
1.GetResults(Nullable
1 forMergeOption) System.Data.Objects.ObjectQuery1.System.Collections.Generic.IEnumerable.GetEnumerator() at System.Collections.Generic.List
1..ctor (IEnumerable1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable
1 ソース)で
明らかに、代わりに SqlConnection をフィードすると、すべてがうまくいきます。
ここで何が起こっているのですか?これはどのように機能しましたか?EDMXの場合はうまくいかなかったのでしょうか?それが ObjectContext 派生であるという事実は関係がありますか?