6

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(Nullable1 forMergeOption) System.Data.Objects.ObjectQuery 1.System.Collections.Generic.IEnumerable.GetEnumerator() at System.Collections.Generic.List1..ctor (IEnumerable 1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable1 ソース)で

明らかに、代わりに SqlConnection をフィードすると、すべてがうまくいきます。

ここで何が起こっているのですか?これはどのように機能しましたか?EDMXの場合はうまくいかなかったのでしょうか?それが ObjectContext 派生であるという事実は関係がありますか?

4

1 に答える 1

1

EF(4.1.10715.0)およびMiniProfiler(1.9.1)パッケージをアップグレードし、MiniProfiler.EF(1.9.1)パッケージを追加した後、App_Startモジュール(MiniProfiler.cs)に移動し、ProfiledDbConnectionFactoryコードの代わりに次のように配置します。

MiniProfilerEF.Initialize();

そして、すべてが順調です!

于 2011-09-23T17:43:21.173 に答える