有没有办法使EFTracing provider与EF 4.1一起工作?实体框架4.1 - EFTracingProvider
EFTracing似乎需要一个objectcontext,我使用dbcontext。
在此先感谢!
有没有办法使EFTracing provider与EF 4.1一起工作?实体框架4.1 - EFTracingProvider
EFTracing似乎需要一个objectcontext,我使用dbcontext。
在此先感谢!
是的,你可以。我将community version与数据库优先DbContexts和代码优先DbContexts结合使用。此答案基于项目网站上的discussion thread。
对于数据库一/设计师DbContexts(通过ADO.NET DbContext Generator templates),你可以简单地添加下面的构造:
public abstract class MyDbContext : DbContext
{
protected MyDbContext(string nameOrConnectionString)
: base(EFTracingProviderUtils.CreateTracedEntityConnection(nameOrConnectionString), true)
{
// enable sql tracing
((IObjectContextAdapter) this).ObjectContext.EnableTracing();
}
}
对于代码,因为EFTracingProvider想要一个完整的实体连接字符串第一DbContexts它有点复杂。您必须手动创建EFTracingConnection实例。以下示例将适用于数据库优先和代码优先上下文。
public abstract class MyDbContext : DbContext
{
protected MyDbContext(string nameOrConnectionString)
: base(CreateTracingConnection(nameOrConnectionString), true)
{
// enable sql tracing
((IObjectContextAdapter) this).ObjectContext.EnableTracing();
}
private static DbConnection CreateTracingConnection(string nameOrConnectionString)
{
try
{
// this only supports entity connection strings http://msdn.microsoft.com/en-us/library/cc716756.aspx
return EFTracingProviderUtils.CreateTracedEntityConnection(nameOrConnectionString);
}
catch (ArgumentException)
{
// an invalid entity connection string is assumed to be a normal connection string name or connection string (Code First)
ConnectionStringSettings connectionStringSetting =
ConfigurationManager.ConnectionStrings[nameOrConnectionString];
string connectionString;
string providerName;
if (connectionStringSetting != null)
{
connectionString = connectionStringSetting.ConnectionString;
providerName = connectionStringSetting.ProviderName;
}
else
{
providerName = "System.Data.SqlClient";
connectionString = nameOrConnectionString;
}
return CreateTracingConnection(connectionString, providerName);
}
}
private static EFTracingConnection CreateTracingConnection(string connectionString, string providerInvariantName)
{
// based on the example at http://jkowalski.com/2010/04/23/logging-sql-statements-in-entity-frameworkcode-first/
string wrapperConnectionString =
String.Format(@"wrappedProvider={0};{1}", providerInvariantName, connectionString);
EFTracingConnection connection =
new EFTracingConnection
{
ConnectionString = wrapperConnectionString
};
return connection;
}
}
如果您正在使用的DbContext和MVC模型首先,使用EntityConnections然后将下面的示例代码应该是意味着你需要:
public partial class BrickHouseFitnessContext : DbContext
{
public BrickHouseFitnessContext(): base(EntityConnectionWrapperUtils.CreateEntityConnectionWithWrappers(ConfigurationManager.ConnectionStrings["BrickHouseFitnessContext"].ConnectionString, "EFTracingProvider"), true)
{
}
另外:
在web.config文件添加以下部分:
<system.data>
<DbProviderFactories>
<add name="EF Tracing Data Provider" invariant="EFTracingProvider" description="Tracing Provider Wrapper" type="EFTracingProvider.EFTracingProviderFactory, EFTracingProvider, Version=1.0.0.0, Culture=neutral, PublicKeyToken=def642f226e0e59b" />
<add name="EF Generic Provider Wrapper" invariant="EFProviderWrapper" description="Generic Provider Wrapper" type="EFProviderWrapperToolkit.EFProviderWrapperFactory, EFProviderWrapperToolkit, Version=1.0.0.0, Culture=neutral, PublicKeyToken=def642f226e0e59b" />
</DbProviderFactories>
和:
<add key="EFTracingProvider.logToConsole" value="true" />
<add key="EFTracingProvider.logToFile" value="C:\BrickHouseFitnessSqlLog.txt" />
有没有必要列入ExtendedEntities还是原来的文章中提到的其他的ObjectContext派生类。运行该代码,您应该看到指定的日志文件,其中包含所有SQL命令。当启用跟踪时,我绕过数据库初始化,
虽然以前的答案有效,但我发现它们存在问题,更简单的解决方案是使用NuGet中的Clutch.Diagnostics.EntityFramework软件包,该软件包在后台使用MiniProfiler。与EFTracingProvider相比,获得工作要简单得多,而且更灵活的解决方案。
该项目在GitHub上的https://github.com/Kukkimonsuta/Clutch
对于EFTracingProvider一样的功能安装的NuGet包,然后实现IDbTracingListener这样的:
using System;
using System.Data.Common;
using System.Diagnostics;
using Clutch.Diagnostics.EntityFramework;
/// <summary>
///
/// </summary>
public class DbTracingListener : IDbTracingListener
{
/// <summary>
///
/// </summary>
/// <param name="connection"></param>
/// <param name="command"></param>
/// <param name="result"></param>
/// <param name="duration"></param>
public void CommandExecuted(DbConnection connection, DbCommand command, object result, TimeSpan duration)
{
Debug.WriteLine(command.CommandText);
Debug.WriteLine(string.Format("Executed in: {0}", duration));
}
/// <summary>
///
/// </summary>
/// <param name="connection"></param>
/// <param name="command"></param>
public void CommandExecuting(DbConnection connection, DbCommand command)
{
}
/// <summary>
///
/// </summary>
/// <param name="connection"></param>
/// <param name="command"></param>
/// <param name="exception"></param>
/// <param name="duration"></param>
public void CommandFailed(DbConnection connection, DbCommand command, Exception exception, TimeSpan duration)
{
}
/// <summary>
///
/// </summary>
/// <param name="connection"></param>
/// <param name="command"></param>
/// <param name="result"></param>
/// <param name="duration"></param>
public void CommandFinished(DbConnection connection, DbCommand command, object result, TimeSpan duration)
{
}
}
这是一个救星。非常感谢。对于那些有兴趣的人,你甚至不一定需要创建一个DbTracingListener。你也可以做一些简单的事情:'Clutch.Diagnostics.EntityFramework.DbTracing.Enable(new GenericDbTracingListener()。OnFinished(c => Log(c.Command.ToTraceString())));'Log是什么您写入的函数来记录Sql文本。我把它放在WCF数据服务项目的实体(即DbContext)类的构造函数中,并且工作正常。 – 2013-06-22 20:01:07
我有一些问题与上面的,但是这是一个非常可行的解决方案和jrummell通过将解决方案发布到问题最难的部分为我节省了时间。有关这方面的更多信息可以在codeplex上的讨论中找到:http://efwrappers.codeplex.com/discussions/262707 – 2011-08-13 21:58:30
jrummel:非常感谢您的帮助,我终于可以使用4.1而不是4.0 :-) – eka808 2011-09-06 08:33:48
在我看来,RTPeat提到的Clutch Tracer比跳过所有这些篮球要简单得多。在尝试Clutch Tracer和Clutch Tracer在10分钟内工作之前,我浪费了一整天的时间。 – 2013-06-22 20:04:21