gpt4 book ai didi

c# - 如何正确配置 Entity Framework ?

转载 作者:IT王子 更新时间:2023-10-29 04:35:13 25 4
gpt4 key购买 nike

要从提供以下内容的 EF 4.1 获取单个回调,我可以编写的最少代码量是多少:

  • OnSQLExecuted(DbCommand cmd, DateTime start, double durationMS, string stacktrace)

目前我们使用了一个似乎正在泄漏性能的讨厌的 hack,我很好奇我们如何在对应用程序的影响最小的情况下实现此回调。


我们可以将其连接到 Mini Profiler 中通过 hacking around - 最初我们更改了 Database.DefaultConnectionFactory 但是与默认工厂混为一谈意味着您不能同时运行两个分析工厂。所以我们走了更激进的路线。


常用的技术非常简单,您实现:DbProviderFactoryIDbConnectionFactoryDbProviderServicesDbConnectionDbCommandDbDataReader 以拦截调用和配置文件的方式。

到目前为止,很简单......但是当你尝试连接它时它会变得困惑:

   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);

}

它需要一些反射 hack 并且在最新版本的 EF 上完全炸弹:

FileLoadException:给定的程序集名称或代码库无效。 (HRESULT 异常:0x80131047)

Frans 都记录了这一点和 Ayende .

如何以稳健而优雅的方式连接我的分析工厂和家族?
有没有其他方法可以得到我的回调?

最佳答案

最简单的方法是使用 Entity Framework tracing wrappers并连接到 EFTracingConnectionCommandFinished。它不会为您提供开始时间,但会为您提供持续时间(从 Now 中减去,可能足够接近)。

我将代码影响称为“中等”,因为您必须更改对现有上下文类的引用。不过,这非常简单。

如果您只想跟踪而不需要实际的回调,NuGet 包有一个 simple default tracing system .

编辑(已添加堆栈跟踪):EF 跟踪包装器不会为您提供堆栈跟踪。您可以轻松获取源代码并添加它,但我认为这会影响性能。

关于c# - 如何正确配置 Entity Framework ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6613180/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com