c# - 检查上下文处理后是否加载贪婪加载实体的正确方法?

标签 c# .net asp.net-mvc entity-framework

可能不相关,但我正在使用:

.NET MVC 5.2.3 w/ Razor 3.2.3, Entity Framework 6.1.3 Code First, Visual Studio 2015.

好的,在我的 Controller 方法中,我有——本质上,但为了简洁起见简化了:

using( var context = new MyContext() ) {
    var person = context.Persons.Include( x => x.PostalCode ).FirstOrDefault();
    return View(person);
}

现在,Zip 数据条目属性最初不是外键...只是用户输入的任何 5 位字符串。然而,现在,它本质上是一个外键,以便我们可以获得邮政编码信息。

public string Zip { get; set; }
[ForeignKey("Zip")]
public virtual PostalCode PostalCode { get; set; }

结构不理想……我知道……

但无论如何,如果用户有我们系统识别的邮政编码,一切都很好,一切都会加载。但是,如果用户有未知或无效的邮政编码,例如00000,EF 发现一个非空的外键,这会导致以下问题:

在我的 View 文件中(因此在我处理完我的上下文之后),我检查我们贪婪加载的实体的属性:

@if( person.PostalCode != null && person.PostalCode.IsInServiceArea ) {
    <div>Service Area HTML</div>
}

不幸的是,由于 EF 覆盖了我的虚拟属性,即使没有 PostalCode,它也不是 NULL。因此,当这段代码运行时,它会抛出一个异常,表明 ObjectContext 已被处理掉,这意味着 EF 正在尝试延迟加载一个实体,即使它已经尝试贪婪地加载并且应该知道它不存在 : (

显而易见的解决方案(请不要回答这些问题):

  • 在进入时验证邮政编码,只允许我们知道的邮政编码并将未知的邮政编码设置为 NULL(我喜欢这个,但我没有时间重新设计它)
  • 在打开上下文时获取 IsInServiceArea 的值并将其直接放入我的 View 模型中,以便我在处理上下文之前设置该值。 (这实际上是我打算做的,所以我不需要这个答案):

问题

In Entity Framework, Code-First, what is the correct way to check to see if a greedily loaded, LEFT OUTER JOIN'd entity, was loaded AFTER the context is disposed of?

根据我找到的答案(例如下面的答案),我认为如果不打开上下文,这可能是不可能的......但我想我还是会问:

最佳答案

因此,回到我的评论,您可以完全禁用延迟加载和代理创建。只需找到您的 dbcontext 类型的构造函数,然后将这两行添加到方法中:

this.Configuration.LazyLoadingEnabled = false;
this.Configuration.ProxyCreationEnabled = false;

通过这种方式,您可以全局禁用它(无论何时创建上下文,运行 ctor,都会应用这些设置)。

或者,如果您在上下文对象创建后对其进行设置,则可以仅针对一个实例禁用它。

关于c# - 检查上下文处理后是否加载贪婪加载实体的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46120028/

相关文章:

c# - 存储更新、插入或删除语句影响了意外的 .自加载实体后修改或删除的实体

c# - 如何访问 UserControl 上的控件?

c# - 根据格式从字符串中获取值

c# - 动态状态机的更多 .net 方法

c# - 如何从引用其他程序集的命令提示符编译 C# DLL?

asp.net-mvc - SignalR:无法连接到本地或任何其他 IP 地址

c# - 是否有通过选择所需区域从文本中创建正则表达式的应用程序?

c# - 自动生成ID

c# - 绘图板/手写笔库

尝试从数据库获取值时,Javascript 'undefined' 错误