gpt4 book ai didi

c# - 确定实体代理的上下文是否已被处置

转载 作者:太空宇宙 更新时间:2023-11-03 13:04:43 24 4
gpt4 key购买 nike

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

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

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

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

  • 如果层次结构是手动创建的,验证将成功。
  • 如果层次结构是使用仍然存在的上下文创建的,验证将成功,尽管速度较慢。
  • 如果层次结构是使用已释放的上下文创建的,验证将失败并返回 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 实例。它们几乎总是在检索数据后立即处理。重新查询数据库似乎不是一个可行的验证选项,因为它是由琐碎的用户输入触发的,并且会减慢整个用户体验。

最佳答案

来自你的问题

Please note that these functions do NOT have access to the context object, just the entity classes.

我想到了两个解决方案,但没有一个真正令人满意:

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

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

虽然它不直接回答您的问题,但您可以避免使用代理,在这种情况下,无论您的模型是否在内存中,您的验证都会以相同的方式进行。不过,通常需要权衡取舍。

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

关于c# - 确定实体代理的上下文是否已被处置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31157685/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com