我正在尝试通过实体框架记录正在发送到数据库的SQL,但没有大量运气。我首先要在新数据库工作流程中使用代码,但是当我在DBContext中添加属性时,我会从数据库中获得一个Oracle错误 - 标识符太长了。我想查看发送到数据库的SQL,以确定它如何创建我的表格,看看哪个标识符名称太长。
目前,我有以下内容,但是在代码运行时似乎从未打过调用。我知道数据正在发送到数据库,因为我会得到例外,但是记录器从未执行。这里确实有些奇怪的事情。几乎是99%的时间,拦截器不起作用。
public class DBLog
{
private string path = @"C:usersmyuserdesktoporacleloggingtest1.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();
}
eNTITYFRAMEWORK的一个例外是在上下文上抛出的。WorkAffiliations.AddLine来自Oracle,因为其中一个标识符太长了,但是这些信息都没有记录。
在某个时候,当我解决这个问题时,日志记录起作用了,因为几天前我确实有一个日志文件,上面有一些旧数据。我只是不知道为什么它当前不起作用。我现在尝试了一些不同的方法来获取此数据。
任何帮助都将受到赞赏!
编辑:尝试Tipx建议的一些有趣的发展...我一直在尝试使用不同的方法来记录进入数据库的SQL命令。我有上面的方法,在DB操作开始之前,我通过函数调用进行了编程注册的IDBCommandInterceptor设置,然后在EntityFramework部分中的App Config中将其放在:
中<interceptors>
<interceptor type="System.Data.Entity.Infrastructure.Interception.DatabaseLogger, EntityFramework">
<parameters>
<parameter value="C:usersmyuserdesktoporclogtst.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
清除数据库会导致日志记录正常工作。如果我尝试在不首先清除数据库的情况下运行代码,则记录不起作用。我怀疑这是因为这是在尝试从模型类生成我的数据库表的过程中发生的,而不是一些正常的CRUD操作。