c# - 为什么 Database.Log 不是一个事件?

标签 c# .net entity-framework

<分区>

Entity Framework 最近添加了使用 Database.Log Hook 捕获 SQL 查询的功能。

令我惊讶的是,它不是作为“ protected 封装友好型装甲”委托(delegate)(又名事件)实现的,而是作为一个裸露的多播委托(delegate).

事实上,我已经看到 EF 团队的成员这样做了:

context.Database.Log = sql => Debug.WriteLine(sql);

我期望的地方:

context.Database.Log += sql => Debug.WriteLine(sql);

避免删除以前注册的处理程序。

此外,我们可以直接调用裸委托(delegate):

context.Database.Log("SORRY SQL IS TOO MEDIEVAL FOR ME");

这当然不是我希望做的事情。

这个选择背后是否有一些理由,或者原始开发人员错过了休息时间,忘记在提交之前添加 event 关键字。 ;)

编辑:突然间,我有一个非常可怕的怀疑:作为一名 .Net 从业者和培训师,我“测量”了 97% 的 .Net 开发人员确信事件必须是 EventHandler s,所以如果我正在审计一个“正常”的公司源代码,我会想:没关系,这个人不知道它可以使用任何委托(delegate)类型并且为了简单起见(我们只需要传输一个 string ) 不想使用 EventHandler 所以他认为他不能使用和事件所以而不是使用一个裸委托(delegate)而不考虑封装“问题”。 但这适用于一家“普通”公司,我认为微软开发人员不太可能...

最佳答案

如果您希望快速为一个特定的 DbContext 实例创建输出,而不是为整个应用程序创建通用记录器,那么这仅仅是每个实例的日志记录。

如果你想记录一切并在应用程序级别设置它,那么你需要实现IDbCommandInterceptor:

MSDN Article

您可以拥有任意数量的拦截器并同时使用 dbContext.Database.Log

关于c# - 为什么 Database.Log 不是一个事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24715526/

相关文章:

c# - 如何在 C# 中手动解析带有可选字段的自定义日期时间格式

c# - 触摸屏编程问题

c# - 必须使用 dbcontext.Database.SqlQuery 声明标量变量 '@custid'?

c# - 创建排序 Func<IQueryable<T>、IOrderedQueryable<T>>?

c# - Windows Phone 8 中的 System.OutOfMemoryException

c# - 为什么必须有人订阅才能发生事件?

c# - ObservableCollection CollectionChanged 在 WPF MVVM 中没有帮助

c++ - 如何将 System::Drawing::Image^ 转换为无符号字符

c# - .NET 图表控件 - 将条形标签放在外侧和左侧吗?

c# - Entity Framework 模型到 Json 结果