[英]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
实例的桌面应用程序。 它们几乎总是在检索数据后立即处理。 重新查询数据库似乎不是验证的可行选项,因为它是由微不足道的用户输入触发的,并且会减慢整个用户体验。
从你的问题
请注意,这些函数不能访问上下文对象,只能访问实体类。
想到了两个解决方案,没有一个真正可口:
WasLoaded
属性。 WasLoaded
可以由任一设置
bit
。然后将其映射到属性; 如果您在上下文之外构造它,则该属性将为false
,如果从上下文加载,则为true
。跟踪器似乎是最干净的,因为它不会污染您的模型。 如果你不关心你的模型,拦截器是一个不错的选择。
虽然它不能直接回答您的问题,但您可以避免使用代理,在这种情况下,您的验证以相同的方式工作,因为您的模型在内存中。 不过,需要考虑通常的权衡。
我不确定您如何检测最后一种情况。 我想你可以让你的跟踪器跟踪更多的实体......让它也跟踪上下文的状态。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.