Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.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#实体框架日志记录(DbContext)不工作_C#_Entity Framework_Entity Framework 6 - Fatal编程技术网

C#实体框架日志记录(DbContext)不工作

C#实体框架日志记录(DbContext)不工作,c#,entity-framework,entity-framework-6,C#,Entity Framework,Entity Framework 6,我试图记录实体框架发送到数据库的sql,但运气不太好。我首先使用代码创建新的数据库工作流,但在向DbContext添加属性时,数据库标识符返回的Oracle错误太长。我想查看发送到数据库的sql,以确定它如何尝试创建我的表,并查看哪个标识符名称太长 目前,我已经准备好了以下内容,但在代码运行时似乎从未调用过它。我知道数据正在被发送到数据库,因为我得到了一个异常,但记录器从未被执行。这里发生了一些非常奇怪的事情。几乎99%的时候,拦截器都不工作 public class DBLog { p

我试图记录实体框架发送到数据库的sql,但运气不太好。我首先使用代码创建新的数据库工作流,但在向DbContext添加属性时,数据库标识符返回的Oracle错误太长。我想查看发送到数据库的sql,以确定它如何尝试创建我的表,并查看哪个标识符名称太长

目前,我已经准备好了以下内容,但在代码运行时似乎从未调用过它。我知道数据正在被发送到数据库,因为我得到了一个异常,但记录器从未被执行。这里发生了一些非常奇怪的事情。几乎99%的时候,拦截器都不工作

public class DBLog
{
    private string path = @"C:\users\myuser\desktop\oracleloggingtest1.txt";

    public void Log(string message)
    {
        File.AppendAllText(path, message);
    }
}

...
...

DBLog lggr = new DBLog();
Database.SetInitializer(new DropCreateDatabaseAlways<TestDbContext>());
using (var context = new TestClearPersonModel())
        {
            context.Database.Log = s => lggr.Log(s);

            context.WorkAffiliations.Add(personReportResult.WorkAffiliations);


            ...

            context.SaveChanges();
        }
公共类DBLog
{
私有字符串路径=@“C:\users\myuser\desktop\oracleloggingtest1.txt”;
公共作废日志(字符串消息)
{
AppendAllText(路径、消息);
}
}
...
...
DBLog lggr=new DBLog();
SetInitializer(新的DropCreateDatabaseAlways());
使用(var context=newtestclearpersonmodel())
{
context.Database.Log=s=>lggr.Log;
context.WorkAffiliations.Add(personReportResult.WorkAffiliations);
...
SaveChanges();
}
Oracle的context.workaffiliations.add行上引发了entityframework的异常,因为其中一个标识符太长,但未记录此信息

前几天,当我处理这个问题时,日志记录起了作用,因为我的桌面上确实有一个几天前的日志文件,其中包含一些旧数据。我只是不明白为什么它现在不起作用。我现在尝试了几种不同的方法来获取这些数据

感谢您的帮助

编辑: 一些有趣的发展尝试Tipx建议。。。我整晚都在尝试使用不同的方法记录要发送到数据库的sql命令。我使用了上面的方法,在db操作开始之前,我通过函数调用以编程方式注册了IDbCommandInterceptor设置,然后我在entityframework部分的应用程序配置中使用了它:

<interceptors>
  <interceptor type="System.Data.Entity.Infrastructure.Interception.DatabaseLogger, EntityFramework">
    <parameters>
      <parameter value="C:\users\myuser\desktop\orclogtst.txt" />
    </parameters>
  </interceptor>
</interceptors>

这些代码都没有运行过。我尝试过的每种不同的日志记录机制都有断点,但从未调用过。我已经尝试了几十次,在这里和那里做了一些小小的调整。在我做了Tipx推荐的一个小更改(只是尝试登录到控制台)之后,突然其他两个日志机制都工作了。我在IDbCommandInterceptor中找到了记录数据的断点,结果发现web.config文件中的interceptor也将数据记录到了指定的文件中


但这只适用于那次处决。我立即尝试重新运行我的代码(不做任何更改),但它不再工作。我取消了对代码的修改,进行了编译,然后再次添加了Tipx建议的修改,但仍然无法工作。是什么原因导致这些方法在没有任何代码更改的情况下突然被调用,并且从此不再被调用?

我认为这与提供程序无关。文件可能已打开/锁定,或者权限可能会执行某些操作

下面是我要做的事情,以找出问题所在:

删除
context.Database.Log=s=>lggr.Log行,并在上下文构造函数中添加以下内容:

Database.Log = (s) => { Console.WriteLine(s); };
然后在控制台上设置一个断点。WriteLine
,运行程序并查看是否命中它。如果您这样做,您就知道这与提供商无关。如果没有,请仔细检查什么类
上下文


另外,还有一点需要注意:您应该考虑使用诸如NLog或Log4Net之类的日志框架。第一次使用它可能需要半个小时,但这是值得的。另外,我亲自在班上安排伐木工人;使用上下文的类不应该告诉您的上下文进行日志记录,这与此无关!:-P

我认为这与供应商无关。文件可能已打开/锁定,或者权限可能会执行某些操作

下面是我要做的事情,以找出问题所在:

删除
context.Database.Log=s=>lggr.Log行,并在上下文构造函数中添加以下内容:

Database.Log = (s) => { Console.WriteLine(s); };
然后在控制台上设置一个断点。WriteLine
,运行程序并查看是否命中它。如果您这样做,您就知道这与提供商无关。如果没有,请仔细检查什么类
上下文


另外,还有一点需要注意:您应该考虑使用诸如NLog或Log4Net之类的日志框架。第一次使用它可能需要半个小时,但这是值得的。另外,我亲自在班上安排伐木工人;使用上下文的类不应该告诉您的上下文进行日志记录,这与此无关!:-P

清除数据库会导致日志正常工作。如果我尝试在没有首先清除数据库的情况下运行代码,日志记录将无法工作。我怀疑这是因为这是在试图从模型类中生成数据库表的过程中发生的,而不是一些正常的CRUD操作。

< P>清除数据库结果导致日志记录正常工作。如果我尝试在没有首先清除数据库的情况下运行代码,日志记录将无法工作。我怀疑这是因为这是在试图从模型类中生成数据库表的过程中发生的。而不是一些普通的crud操作。

这可能与使用Oracle提供程序而不是sql提供程序有关吗?使用拦截器对我有效。这可能与使用Oracle提供程序而不是sql提供程序有关吗?使用拦截器对我有效。我在lggr.log()上设置了断点可以看出,在代码运行时,它甚至从未被调用过。只是为了