Какой минимальный объем кода я могу написать, чтобы получить один обратный вызов от EF 4.1, который обеспечивает следующее:
OnSQLExecuted(DbCommand cmd, DateTime start, double durationMS, string stacktrace)
В данный моментмы используем неприятный хак, который, похоже, снижает производительность, мне интересно, как мы можем добиться этого обратного вызова с минимальным влиянием на приложение.
Мы можем подключить это в Mini Profiler путем хакерства вокруг - изначально мы изменили Database.DefaultConnectionFactory
, однако при взломе с заводскими настройками по умолчанию вы можетене иметь двух профилирующих фабрик, работающих одновременно.Поэтому мы пошли по более агрессивному маршруту.
Обычно используемая техника довольно проста, вы реализуете: DbProviderFactory
, IDbConnectionFactory
, DbProviderServices
, DbConnection
, 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<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);
}
Требуется несколько взломов отражений и полных бомб на последней версии EF:
FileLoadException: The given assembly name or codebase was invalid. (Exception from HRESULT: 0x80131047)
Это было задокументировано как Франс и Айенде .
Как подключить мои профилирующие фабрики инадежную и элегантную семью?
Есть ли другой способ вернуть мой звонок?