EF4 DbContext:如何集中审核数据库读取
Posted
技术标签:
【中文标题】EF4 DbContext:如何集中审核数据库读取【英文标题】:EF4 DbContext: How to centrally audit database reads 【发布时间】:2012-12-29 10:18:40 【问题描述】:我知道,我知道。为什么会有人想要这样做?该应用程序已经审核了数据的更改,但现在企业也希望审核所有读取(我不得不说,没有令人信服的用户故事)。我已经给了他们所有反对的论据,但他们坚持。
那么 EF/DbContext 是否提供了一个扩展点,适用于拦截从数据库返回的所有记录并在审计跟踪中写入条目?还是有另一种明智的做法?
【问题讨论】:
我真的很想为此提供一个正当的理由。否则在 SQL Profiler 上打一巴掌,看着 DB 停止运行并完成它。 我同意,我同意。但企业认为自己最清楚。 【参考方案1】:您可以使用ObjectContext.ObjectMaterialized。 MSDN sn-p:
从数据中的数据创建新实体对象时发生 source 作为查询或加载操作的一部分。
在所有标量、复杂和引用之后引发此事件 属性已在对象上设置,但在集合之前 加载。如果对象中存在具有相同键值的对象 在上下文中,实体框架将不会重新创建对象,而这 不会引发事件。
但这只会跟踪通过您的 EF 实现从 Db 读取的项目。
【讨论】:
但这不会跟踪字段访问(以及随后读取已在内存中的记录)。 它有一些限制,但至少这种方法给了我一种集中代码的方法,因此不需要太多的工作来实现,并且当他们意识到我不是在开玩笑时很容易删除当我说这意味着严重的性能损失时:) 可以通过不同步执行审计而是将更改放入队列并从另一个进程处理队列来减少性能损失。那么唯一的惩罚就是写入队列,也许还有对象的序列化 @QuintonBernhardt 不错的想法,虽然从开发和维护的角度来看可能很昂贵,因为我们目前没有使用排队技术。 然后你可以创建一个BackgroundWorker
来异步执行它。没有队列,您的查询不会受到审核的影响。以上是关于EF4 DbContext:如何集中审核数据库读取的主要内容,如果未能解决你的问题,请参考以下文章
EF 4.1 DbContext Generattor - 将实体放在不同的项目中?
DbContext Generator - 为另一个命名空间中的模型配置