【发布时间】:2014-08-10 15:20:32
【问题描述】:
我在 Visual Studio 的调试会话中深入业务层的某个地方,试图弄清楚为什么实体在尝试持久化更改时表现异常。
此时在调用堆栈中获取对该实体所属的 DbContext 的引用真的很有帮助。
即查看此实体的状态是什么(未更改、已修改等)。
所以我正在寻找这样的辅助方法:
var db_context = DbContextHelpers.GetDbContext(entity);
// after that I could do something like this
var state = db_context.Entry(entity);
我可以在调试期间在即时窗口中使用这些东西。
大家有什么建议吗?
补充说明
实体必须知道某处的DbContext,因为它正在使用它来延迟加载导航属性?
【问题讨论】:
-
我对你的方法的正确性有些怀疑......如果你需要调试一些东西,你为什么不调试一些东西呢? .NET 有很好的工具(VS 中的调试器就是一个很好的例子)。此外,您可能想对单元测试进行一些研究,这也可能对您有所帮助..
-
我正在调试@walther。我在调试会话中非常深入,我只需要获取我正在查看的模型的
EntityState- 例如业务层深处的 12 层。它无法访问在代码的完全其他部分创建的 DbContext。 -
如何设置一个 hack 来保存
DbContext以便在您需要的地方可用?如果您正在开发 ASP.NET 应用程序,您可以将它放在HttpContext.Current.Items中或将其作为线程本地保存,您可以简单地将DbContext分配给某个静态类中的某个静态字段。在某些情况下,您可以在 VS 调试器的即时窗口中执行此操作,尤其是在HttpContext中轻松完成。完成调试后,请务必删除 hack :-)。 -
@Dirk Boer 你是绝对正确的,但有时最好只做一些务实的事情。如果您更频繁地进行这种调试,您甚至可以自己编写一些帮助代码,自动保持对
DbContext的引用,并在您调试时启用它——例如通过 DI 或配置标志。我不确定是否可以为实体对象检索DbContext,您可以使用 VS 调试器的监视功能深入研究该对象,也许您可以找到一些可以通过反射提取的参考。 -
哇,@walther,很惊讶你怎么从这个问题中对我的架构了解这么多?听说过泄漏抽象吗? Entity Framework 绝对是其中之一,如果你做了一些现实生活中的高流量应用程序,你会发现不关心数据库的理论绝对不能完美地工作 - 有时你需要在调试会话中弄脏你的手看看发生了什么。
标签: c# entity-framework