实体框架最近添加了使用Database.Log
挂钩捕获SQL查询的功能。
让我感到惊讶的是,它并没有被实现为“受保护的封装友好装甲”代表,又称事件,而是作为一个裸多播代表
事实上,我见过EF团队成员这样做了:
context.Database.Log = sql => Debug.WriteLine(sql);
我期待的地方:
context.Database.Log += sql => Debug.WriteLine(sql);
以避免删除以前注册的处理程序。
此外,我们可以直接调用它:
context.Database.Log("SORRY SQL IS TOO MEDIEVAL FOR ME");
当然,这不是我期望做的事情。
这个选择背后是否存在一些理由,或者原始开发者错过了咖啡休息时间并忘记在提交之前添加event
关键字。 ;)
EventHandler
s,所以如果我正在审计一个“正常”的公司源代码,我会想:没关系,这家伙不知道它可以使用任何委托类型而且为了简单(我们只需要转移一个string
)不希望使用EventHandler
所以他认为他不能使用和事件,所以改为使用一个裸代理而不考虑封装“问题”。
但这将是一个“正常”的公司,我认为这是微软开发人员极不可能的......
答案 0 :(得分:1)
这只是每个实例的日志记录,以防您很快想要为一个特定的DbContext
实例创建输出,而不是为整个应用程序创建通用记录器。
如果您想记录所有内容并在应用程序级别设置它,那么您需要实现IDbCommandInterceptor
:
您可以拥有任意数量的拦截器并同时使用dbContext.Database.Log
。