क्या कोड की न्यूनतम राशि मैं एफई 4.1 से एक भी कॉलबैक कि निम्नलिखित प्रदान करता है पाने के लिए लिख सकते हैं:मैं एंटिटी फ्रेमवर्क को सही ढंग से कैसे प्रोफाइल करूं?
OnSQLExecuted(DbCommand cmd, DateTime start, double durationMS, string stacktrace)
फिलहाल हम चाहते हैं कि प्रतीत हो रहा है एक बुरा हैक का उपयोग प्रदर्शन को लीक करना, मैं उत्सुक हूं कि हम इस कॉलबैक को ऐप पर कम से कम प्रभाव के साथ कैसे प्राप्त कर सकते हैं।
हम इस hacking around द्वारा Mini Profiler में तार करने में सक्षम हैं - शुरू में हम Database.DefaultConnectionFactory
बदल तथापि mucking डिफ़ॉल्ट कारखाने के साथ मतलब है कि आप दो रूपरेखा कारखानों एक ही समय में जा रहा नहीं हो सकता। तो हम अधिक आक्रामक मार्ग गए।
तकनीक आमतौर पर इस्तेमाल किया सुंदर सीधे आगे है, तो आप को लागू: DbProviderFactory
, IDbConnectionFactory
, DbProviderServices
, DbConnection
, DbCommand
और DbDataReader
इस तरह से है कि वे कॉल और प्रोफ़ाइल अवरोधन में।
अब तक, आसान ... लेकिन यह गंदा हो जाता है जब आप इस ऊपर तार करने की कोशिश:
FileLoadException: The given assembly name or codebase was invalid. (Exception from HRESULT: 0x80131047)
:
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<DataRow>().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);
}
यह कुछ प्रतिबिंब हैक्स और एफई के नवीनतम संस्करण पर पूरी तरह से बम की आवश्यकता है
यह Frans और Ayende दोनों द्वारा प्रलेखित किया गया था।
मैं अपने प्रोफाइलिंग कारखानों और परिवार को एक मजबूत और सुरुचिपूर्ण तरीके से कैसे तारूं?
क्या मेरा कॉलबैक पाने का कोई और तरीका है?
प्रश्न EFv4.1 का उल्लेख कर रहा है। मुझे यकीन नहीं है कि ट्रेसिंग रैपर डीबीकॉन्टेक्स्ट एपीआई के साथ काम करता है या नहीं। मैं इसे लंबे समय तक आजमाने की कोशिश करता हूं लेकिन मैंने अभी भी इसे जांच नहीं लिया है। –