2011-12-29 11 views
7

型のオブジェクトをキャストすることができません「MvcMiniProfiler.Data.EFProfiledDbConnection」「System.Data.SqlClientのを入力します。 SqlConnection '。「System.Data.SqlClient.SqlConnection」を入力するタイプ「MvcMiniProfiler.Data.EFProfiledDbConnection」のオブジェクトをキャストすることができません

MvcMiniProfiler 1.9.0にアップグレードしようとしていますが、MiniProfilerEF.Initialize()を呼び出すと、この問題が発生します。私はsystem.data設定セクションを削除しました。私は何が間違っているのか分からない。私はサイト上の手順に従っているが、多分私は何かを逃した?

私は最初にEFコード4.1を使用しています。私はdatacontextを作成するために、私のconnectionstringの名前をコンストラクタに渡しています。

ウェブアクティベーター

using Project.Web.App_Start; 
using WebActivator; 

[assembly: PreApplicationStartMethod(typeof(MiniProfiler), "Start")] 

namespace Project.Web.App_Start { 
    public class MiniProfiler { 
     public static void Start() 
     { 
      if (Eco.Environment.IsDevelopment) { 
       MiniProfilerEF.Initialize(); 
      } 
     } 
    } 
} 

のStructureMapレジストリ:

using Project.Domain.Repositories; 
using StructureMap.Configuration.DSL; 

namespace Project.Web.DependencyResolution.Registries { 
public class RepositoriesRegistry : Registry { 
    public RepositoriesRegistry() { 
     For<IProjectDataContext>().HybridHttpOrThreadLocalScoped().Use(() => new ProjectDataContext(Eco.Database.Name)); 
      } 
    } 
} 

DataContextのコンストラクタ:

public ProjectDataContext(string nameOrConnectionString) 
     : base(nameOrConnectionString) { 
     Active = new Active(this); 
    } 

ドキュメントは、私が唯一必要と言うので、私は私の設定フロンsystem.dataのDataProviderを削除しましたMiniProfilerEF.Initialize()を呼び出します。

**更新

は以前1.7 MvcMiniProfilerに私がDatabase.DefaultConnectionFactoryプロパティを設定する必要がありましたが、私はそれを削除しました。 Database.DefaultConnectionFactoryは常にSqlConnectionFactoryとして戻ってくるので、ProfiledConnectionFactoryなんかそんなことはしてはいけませんか?

+0

コード+設定ファイルを提供できますか?通常、DBContextクラスと同じ名前の設定ファイルに接続文字列を定義し、デフォルト以外のコンストラクタを使用する必要はありません。 – Tejs

+0

IircナゲットにEFサンプルセットアップがあります。しかし、:私は尋ねることができます:あなたはいつもプロファイル接続をしていますか?または、時には(おそらくユーザーに依存して)プロファイル接続を使用し、時には裸のSQL接続を使用しますか? –

+0

@MarcGravell私はこれをバージョン1.7で行いました。私はプロファイル接続(デバッグ)からSQL接続(リリース)に切り替えるだろう。それは正常に働いた。 –

答えて

0

ここでわかる問題は、ProjectDataContextがMvcProfilerプロキシでは見つかりませんでしたプロパティ "Active"にいくつかのデータコンテキストをカプセル化していることです。

以上、EFProfiledDbConnectionは実際にはDbConnectionの子ですが、SqlConnectionの子ではありません。これは、MySql、Postgresなどの異なるDbプロバイダを使用する抽象化の観点から作成されています.DbConnectionではなく、SqlConnection(これはMsSqlのプロバイダです)ではなく、すべての変数をコードで確認してください。

2

この同じエラーが発生しました。それは私にナッツを運転したが、私はそれを最終的に考え出した。私の問題は、web.config、アセンブリ、Initialize_42、またはInitialize(false)ハックなどとは関係ありませんでした。

App_Start:

Database.SetInitializer(
    new MigrateDatabaseToLatestVersion<DataContext, Migrations.Configuration>() 
); 

移行/ Configuration.cs:

internal sealed class Configuration 
    : DbMigrationsConfiguration<Path.To.DataContext> 
{ 
    public Configuration() 
    { 
     AutomaticMigrationsEnabled = true; 
    } 
} 
私が間違っていたのはここ

は、私はこのような移行の自動適用を有効にしていた...です

これはWebActivatorによって次のように起動されました:

[assembly: WebActivator.PreApplicationStartMethod(
    typeof(service_tracker_mvc.App_Start.DatabaseInitializer), "Start")] 

このプロセスを無効にすると、プロファイラが機能しなくなっていました。この問題は、このinitプロセスがですぐに発生していたことがあまりにも遅いということです。それは通常Application_Startの間に起こります(あなたがこの派手なWebActivatorのものを使用していない場合)ので、PostStartに変更しました。今では動作します:

     ▼▼▼▼ 
[assembly: WebActivator.PostApplicationStartMethod(
    typeof(service_tracker_mvc.App_Start.DatabaseInitializer), "Start")] 
0

私はこの同じ問題を抱えていたと私はそれを修正することが分かっ方法が垣間見るに移動しました:http://getglimpse.com/。私の意見では、

1

があなたのDBのコンストラクタの内容にブレークポイントを置く、これはminiprofilerを初期化する前にDB操作を行うことによって引き起こされhttps://stackoverflow.com/a/10814033/311289

を見るなど、完全な、使いやすいminiprofilerよりもずっと良いですコンテキスト、もう1つはMiniProfilerEF.Initialize();行にあり、初期化が最初になるまで修正してください。

2

MiniProfiler.EF6ではなく、MiniProfiler.EFを追加したのは間違いです。 MiniProfiler.EFを削除し、EF6バージョンに置き換えると問題が解決しました。

+0

Samさん、ありがとうございました。 – Bassie

関連する問題