繁体   English   中英

C#实体框架记录(DbContext)无法正常工作

[英]C# Entity Framework Logging (DbContext) not working

我正在尝试记录由Entity Framework发送到数据库的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();
        }

Oracle的context.workaffiliations.add行上引发了来自objectframework的异常,因为其中一个标识符太长,但是没有记录任何此信息。

在前一天的某个时候,当我搞砸这个问题时,日志记录仍然有效,因为几天前我的桌面上确实有一个日志文件,里面有一些旧数据。 我只是不知道为什么它当前不起作用。 我现在尝试了几种不同的方法来获取此数据。

任何帮助表示赞赏!

编辑:尝试Tipx建议的一些有趣的发展...我一直在整夜试图能够使用不同的方法来记录将要进入数据库的sql命令。 我有上面的方法,在数据库操作开始之前,我通过函数调用以编程方式注册了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文件的拦截器也将数据记录到了那里指定的文件中。

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

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

这是我要找出问题所在的方法:

删除context.Database.Log = s => lggr.Log(s); 行,然后在您的上下文构造函数中添加以下代码:

Database.Log = (s) => { Console.WriteLine(s); };

然后在Console.WriteLine上放置一个断点,运行程序,看看是否命中了它。 如果这样做,您知道它与提供程序无关。 如果您不这样做,请再次检查什么类context

另外,在旁注:您应该研究使用日志记录框架,例如NLog或Log4Net。 第一次使用它可能需要半小时才能使其正常工作,但这是值得的。 另外,我亲自将记录器设置在班级中。 使用上下文的类不应告诉您的上下文进行记录,这与业务无关! :-P

清除数据库将导致日志正常运行。 如果我尝试运行代码而不先清除数据库,则日志记录将不起作用。 我怀疑这是因为这是在尝试从模型类生成数据库表的过程中发生的,而不是某些常规的操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM