چگونه می توان Entity Framework را به درستی پروفایل کرد؟

حداقل کدی که می توانم بنویسم تا بتوانم از EF 4.1 یک پاسخ مجدد دریافت کنم که موارد زیر را فراهم کند چیست:

  • OnSQLExecuted (DbCommand cmd، DateTime start، double duration MS ، رشته stacktrace)

در حال حاضر ما از یک هک ناخوشایند استفاده می کنیم که به نظر می رسد عملکرد نشتی دارد ، من کنجکاو هستم که چگونه می توانیم با کمترین تأثیر بر روی برنامه به این پاسخ مجدد دست پیدا کنیم.


ما می توانیم این اتصال را در Mini Profiler توسط هک کنیم در - در ابتدا پایگاه داده را تغییر دادیم. DefaultConnectionFactory با این حال کار با پیش فرض کارخانه به معنای شما است دو کارخانه پروفایل سازی همزمان نداشته باشند. بنابراین مسیر تهاجمی تری را طی کردیم.


این روش معمولاً رو به جلو است ، شما پیاده سازی می كنید: DbCommand و DbDataReader به گونه ای که تماس ها و پروفایل را رهگیری کنند.

تا اینجا ، آسان است ... با این وجود وقتی این موضوع را سیم کشی می کنید ، کثیف می شود:

   try
    {
        // ensure all the factories are loaded 
        DbProviderFactories.GetFactory("...");
    }
    catch (ArgumentException)
    {
    }

    Type type = typeof(DbProviderFactories);

    DataTable table;
    // SUPER UGLY - Can this be done in another way? 
    object setOrTable = (type.GetField("_configTable", BindingFlags.NonPublic | BindingFlags.Static) ??
                    type.GetField("_providerTable", BindingFlags.NonPublic | BindingFlags.Static)).GetValue(null);
    if (setOrTable is DataSet)
    {
        table = ((DataSet)setOrTable).Tables["DbProviderFactories"];
    }

    table = (DataTable)setOrTable;

    foreach (DataRow row in table.Rows.Cast().ToList())
    {
        DbProviderFactory factory;
        try
        {
            factory = DbProviderFactories.GetFactory(row);
        }
        catch (Exception)
        {
            continue;
        }

        var profType = typeof(MvcMiniProfiler.Data.EFProfiledDbProviderFactory<>).MakeGenericType(factory.GetType());


        DataRow profiled = table.NewRow();
        profiled["Name"] = row["Name"];
        profiled["Description"] = row["Description"];
        profiled["InvariantName"] = row["InvariantName"];
        profiled["AssemblyQualifiedName"] = profType.AssemblyQualifiedName;
        table.Rows.Remove(row);
        table.Rows.Add(profiled);

    }

به برخی از هک های انعکاس و بمب کاملاً جدید در آخرین نسخه EF نیاز دارد:

FileLoadException: نام مجموعه داده شده یا پایگاه کد نامعتبر است. (استثنا از HRESULT: 0x80131047)

این مستندات توسط Frans و Ayende مستند شده است.

چگونه می توانم کارخانه ها و خانواده های پروفایل خود را به روشی محکم و ظریف سیم کشی کنم ؟
آیا روش دیگری برای دریافت پاسخ من وجود دارد؟

21
задан Community 23 May 2017 в 11:52
поделиться