1

データアクセスに使用されるLlblgenを使用してmvc-mini-profilerをasp.netmvcアプリケーションに統合しようとしています。llblgenのCommonDaoBase.CreateConnectionをオーバーライドしようとしました:

public override DbConnection CreateConnection(string connectionString)
{
  return MvcMiniProfiler.Data.ProfiledDbConnection.Get(base.CreateConnection(connectionString));
}

しかし、これにより、「SqlConnectionにキャストできません...」という例外が発生しました。誰かがmvc-mini-profilerをllblgenで動作させていますか?

4

2 に答える 2

1

Miha Markicが彼のブログに回答を投稿しました:http://blog.rthand.com/post/2011/07/24/Integrating-MvcMiniProfiler-and-LLBLGenPro.aspx

于 2011-07-30T12:05:51.830 に答える
0

LLBLGenProv3が必要です。V2はsqlserverにdbproviderfactoryを使用しますが、生成されたコードには、まだSqlClientクラスへのハードコードされたキャストがいくつかあります。v3はそうではありません。私はあなたがv2を使うと思いますか?

さらに、プロファイラーのProfiledDbProviderFactory.csに小さな変更を加える必要があります。

/// <summary>
/// Extension mechanism for additional services;  
/// </summary>
/// <returns>requested service provider or null.</returns>
object IServiceProvider.GetService(Type serviceType)
{
    if(serviceType == typeof(ProfiledDbProviderFactory))
    {
        // For LLBLGen Pro v3 and up.
        return tail;
    }
    IServiceProvider tailProvider = tail as IServiceProvider;
    if (tailProvider == null) return null;
    var svc = tailProvider.GetService(serviceType);
    if (svc == null) return null;

#if ENTITY_FRAMEWORK
    if (serviceType == typeof(DbProviderServices))
    {
        svc = new ProfiledDbProviderServices((DbProviderServices)svc, profiler);
    }
#endif
    return svc;
}

編集します。フレームワークはADO.NETから取得したDbProviderFactoryを使用しているため、これが機能するかどうかはわかりません。そのファクトリは、ProfiledDbProviderFactoryではなく、実際のSqlclientのファクトリです。ここでプロファイル接続を作成できますが、それは機能しません。ファクトリは接続から取得されず、接続はADO.NET(DbProviderFactories.GetFactory())から取得されたファクトリから作成され、他のすべての要素が作成されます。その工場でも。

mvcプロファイラーは、実際のファクトリタイプをラップするラッパーを使用して、リフレクションを介してDbProviderFactoriesのデータテーブルを上書きする必要があります。これはちょっと厄介ですが、本で物事を行うデータアクセスコードで物事を機能させる唯一の方法は、ファクトリを取得し、ファクトリを介して要素を作成することです。

驚いたことに、Linq to sqlとEntityFrameworkは、接続オブジェクトから取得したファクトリで動作するようです。そもそも、どのようにしてその接続オブジェクトを作成したのでしょうか。

于 2011-06-16T10:05:48.173 に答える