Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 不带配置文件的实体框架跟踪提供程序包装器_C#_Entity Framework 4 - Fatal编程技术网

C# 不带配置文件的实体框架跟踪提供程序包装器

C# 不带配置文件的实体框架跟踪提供程序包装器,c#,entity-framework-4,C#,Entity Framework 4,我想对SQLCE4数据库使用实体框架代码优先的方法。一切看起来都很好,但我在调试sql查询时遇到了问题。我发现EFTracing from应该正是我需要的,但如果没有app.config文件,我不知道如何使用它。我不太喜欢这种配置。我只想用C代码来设置和运行一切。我认为可以使用如下代码: using (System.Data.Common.DbConnection c = new EFTracingProvider.EFTracingConnection( new Sy

我想对SQLCE4数据库使用实体框架代码优先的方法。一切看起来都很好,但我在调试sql查询时遇到了问题。我发现EFTracing from应该正是我需要的,但如果没有app.config文件,我不知道如何使用它。我不太喜欢这种配置。我只想用C代码来设置和运行一切。我认为可以使用如下代码:

using (System.Data.Common.DbConnection c = 
    new EFTracingProvider.EFTracingConnection(
        new System.Data.SqlServerCe.SqlCeConnection(conn)))
{
    using (var context = new MyContext(c))
    {
        var a = from data in context.Projects select data;
    }
}
但它不起作用。它抛出异常:

无法确定类型为的连接的提供程序名称 EFTracingProvider.EFTracingConnection'


有没有简单的方法可以只在代码中正确创建包装连接?

跟踪SQL查询的真正方法是调用ToString方法,如下所示:

var t = from c in _entities.CompanyDetail
        select c;

string test = t.ToString();

我不知道,但你可能想试试。尽管名称为MVCMiniProfiler,但它也提供SQL查询分析,并且在不使用配置文件的情况下工作

我是通过围绕ObjectContext创建一个包装器类并使用该包装器而不是原始上下文来实现的。下面是一个上下文包装器示例:

public partial class LoggedContext : MyContext
{
    public LoggedContext()
        : this("name=MyEntities")    // Adjust this to match your entities
    {
    }

    public LoggedContext(string connectionString)
        : base(EntityConnectionWrapperUtils.CreateEntityConnectionWithWrappers(connectionString)
    {
    }

    private EFTracingConnection TracingConnection
    {
        get { return this.UnwrapConnection<EFTracingConnection>(); }
    }

    public event EventHandler<CommandExecutionEventArgs> CommandExecuting
    {
        add { this.TracingConnection.CommandExecuting += value; }
        remove { this.TracingConnection.CommandExecuting -= value; }
    }

    public event EventHandler<CommandExecutionEventArgs> CommandFinished
    {
        add { this.TracingConnection.CommandFinished += value; }
        remove { this.TracingConnection.CommandFinished -= value; }
    }

    public event EventHandler<CommandExecutionEventArgs> CommandFailed
    {
        add { this.TracingConnection.CommandFailed += value; }
        remove { this.TracingConnection.CommandFailed -= value; }
    }
}

我的问题的解决方案是使用DbContext对象

public class MyContext : DbContext
{
  public MyContext()
    : base(CreateConnection("Data Source=file.sdf", 
                            "System.Data.SqlServerCe.4.0"), true)
  { }

  public DbSet<Project> Projects { get; set; }

  public static bool TraceEnabled = true;

  private static DbConnection CreateConnection(string connectionString, 
                                               string providerInvariantName)
  {
    DbConnection connection = null;
    if (TraceEnabled)
    {
      EFTracingProviderConfiguration.RegisterProvider();
      EFTracingProviderConfiguration.LogToConsole = true;
      string wrapperConnectionString = String.Format(@"wrappedProvider={0};{1}",
         providerInvariantName, connectionString);
      connection = new EFTracingConnection() 
      { 
        ConnectionString = wrapperConnectionString 
      };
    }
    else
    {
      DbProviderFactory factory = DbProviderFactories.GetFactory(providerInvariantName);
      connection = factory.CreateConnection();
      connection.ConnectionString = connectionString;
    }
    return connection;
  }
}

抱歉,编辑不好,我正在用手机接听。感谢Uwe keim的帮助感谢MVCMiniProfiler。这可能真的很有用。我使用代码优先的方法,所以有DbContext而不是ObjectContext,所以我需要一些不同的东西。这似乎不适用于迁移部分。我正在寻找解决办法。
EFTracingExtensions.InitSqlTracing(logger);    // only call this once

using (var context = new LoggedContext())
{
    var a = from data in context.Projects select data;
}
public class MyContext : DbContext
{
  public MyContext()
    : base(CreateConnection("Data Source=file.sdf", 
                            "System.Data.SqlServerCe.4.0"), true)
  { }

  public DbSet<Project> Projects { get; set; }

  public static bool TraceEnabled = true;

  private static DbConnection CreateConnection(string connectionString, 
                                               string providerInvariantName)
  {
    DbConnection connection = null;
    if (TraceEnabled)
    {
      EFTracingProviderConfiguration.RegisterProvider();
      EFTracingProviderConfiguration.LogToConsole = true;
      string wrapperConnectionString = String.Format(@"wrappedProvider={0};{1}",
         providerInvariantName, connectionString);
      connection = new EFTracingConnection() 
      { 
        ConnectionString = wrapperConnectionString 
      };
    }
    else
    {
      DbProviderFactory factory = DbProviderFactories.GetFactory(providerInvariantName);
      connection = factory.CreateConnection();
      connection.ConnectionString = connectionString;
    }
    return connection;
  }
}
using (var context = new MyContext())
{
    var a = context.Projects.FirstOrDefault();
}