繁体   English   中英

确定实体代理的上下文是否已被释放

[英]Determine if the context of an entity proxy has been disposed

在 EF 6 项目中,我正在为实体编写验证函数。 有些是静态的,而有些是实体本身的实例方法。

忽略这是否是不好的做法,我想检查实体是否是使用上下文创建的,如果是,它们是否仍然附加。

请注意,这些函数不能访问上下文对象,只能访问实体类。

例如,一个方法验证Department实体并将验证级联到所有关联的Department.Employee实例。

  • 如果层次结构是手动创建的,则验证将成功。
  • 如果层次结构是使用仍然存在的上下文创建的,则验证将成功,但速度较慢。
  • 如果层次结构是使用已ObjectDisposedException的上下文创建的,则验证将失败并显示ObjectDisposedException (前提是已启用代理创建且未使用.Include(***) )。

所以问题是,是否可以在不访问DbContext实例的情况下检测上述场景? 如果不是,我们如何才能最好地验证整个层次结构,而不管它们是如何创建的。

var result = true;
var departments = ???; // Constructed manually or through a DbContext instance.

foreach (var department in departments)
{
    result &= department.Validate();

    foreach (var employee in department.Employees)
    {
        result &= employee.Validate();
    }
}

编辑:请注意,这是针对不能具有长时间运行的DbContext实例的桌面应用程序。 它们几乎总是在检索数据后立即处理。 重新查询数据库似乎不是验证的可行选项,因为它是由微不足道的用户输入触发的,并且会减慢整个用户体验。

从你的问题

请注意,这些函数不能访问上下文对象,只能访问实体类。

想到了两个解决方案,没有一个真正可口:

  1. 构建您自己的跟踪器并以某种方式使其可用于这些方法。
  2. 向您的实体添加一些内容,例如在您查询上下文时设置的WasLoaded属性。 WasLoaded可以由任一设置
    1. 编写一个设置它的 EF 拦截器。
    2. 添加一个所有值都设置为 1 的人工bit 。然后将其映射到属性; 如果您在上下文之外构造它,则该属性将为false ,如果从上下文加载,则为true

跟踪器似乎是最干净的,因为它不会污染您的模型。 如果你不关心你的模型,拦截器是一个不错的选择。

虽然它不能直接回答您的问题,但您可以避免使用代理,在这种情况下,您的验证以相同的方式工作,因为您的模型在内存中。 不过,需要考虑通常的权衡。

我不确定您如何检测最后一种情况。 我想你可以让你的跟踪器跟踪更多的实体......让它也跟踪上下文的状态。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM