c# - EF 6 延迟加载已禁用,但仍会加载子记录

标签 c# entity-framework entity-framework-6 lazy-loading

我首先使用 EF6 代码。有两个表,LessonLessonSectionsLessonSections 表有一个指向 Lesson.Id

的外键

这是没有删除任何重要字段的 Lesson 类:

public partial class Lesson
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public Lesson()
    {
        LessonSections = new HashSet<LessonSection>();
    }

    [StringLength(50)]
    public string Id { get; set; }

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<LessonSection> LessonSections { get; set; }
}

下面是我如何启动我的数据模型:

    var db = new Touch_Type_Trainer_DB.DataModel();
    db.Configuration.ProxyCreationEnabled = false;
    db.Configuration.LazyLoadingEnabled = false;

就在我第一次调用数据库以检索数据库中的第一课之后,生成的对象没有LessonSections

Before second call

然后我进行第二次调用以将这些部分检索到一个单独的对象中。 (它们必须在单独的对象中,因为我想将它们序列化为 JSON 字符串,并且如果我使用标准 EF,序列化程序会在 LessonLessonSections 之间的循环引用上停止延迟加载。)

After second call

现在我的原始对象有两个部分从数据库加载,即使我从未访问过 LessonSections 属性,即使 LazyLoadingEnabled 设置为 False!

为什么要加载 LessonSections

编辑:

我正在使用 Newtonsoft 将我的对象序列化为 JSON 字符串。也许 Newtonsoft 中有一个我应该设置的配置设置,这样它就不会陷入循环引用问题?

此外,我确实希望为大部分代码启用 LazyLoading,只是不为序列化部分启用。

最佳答案

这对您来说是个问题,还是您只是想知道为什么会这样?

DBContext 为您跟踪所有引用。当您加载这些部分时,它知道这些类(class)有对它们的引用,并为您连接起来。

您可以通过断开对象或从不同的 dbcontext 加载部分来停止此操作

myDbContext.Entry(someLesson).State=Detached;

关于序列化问题,请参见此问答 How Do You "Really" Serialize Circular Referencing Objects With Newtonsoft.Json?

http://johnnycode.com/2012/04/10/serializing-circular-references-with-json-net-and-entity-framework/

关于c# - EF 6 延迟加载已禁用,但仍会加载子记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31978337/

相关文章:

c# - Newtonsoft JSON.net 反序列化错误,其中 JSON 中的字段更改顺序

c# - 使用 watin 搜索级联元素

c# - ExecuteScript(setInterval) 完成后继续 `while` 循环

c# - 搭建脚手架时如何指定在 View 中使用哪个外键列

c# - Entity Framework 数据加载策略对比

orm - ORM 和微型 ORM 有什么区别?

c# - 如何检查 ObjectQuery<T> 表达式树中是否存在 OrderBy

c# - 将属性设置为虚拟时停止加载 Entity Framework

sql-server - OrderBy().FirstOrDefault(<条件>) 与Where(<条件>).OrderBy().FirstOrDefault()

c# - 向所有查询 Entity Framework 添加过滤器