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

2023-11-21

我首先使用 EF6 代码。有两张桌子,Lesson and LessonSections. The LessonSections表有一个外键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 字符串,并且序列化程序在之间的循环引用上停止Lesson and LessonSections如果我使用标准 EF LazyLoading。)

After second call

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

为什么要这样做LessonSections加载?

Edit:

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

另外,我确实希望为大部分代码启用延迟加载,而不是为序列化部分启用延迟加载。


这对您来说是个问题吗,或者您只是好奇为什么会发生这种情况?

DBContext 会为您跟踪所有引用。当您加载这些部分时,它知道课程引用了它们,并为您连接起来。

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

myDbContext.Entry(someLesson).State=Detached;

对于序列化问题,请参阅此 Q&A如何使用 Newtonsoft.Json“真正”序列化循环引用对象?

or

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

EF 6 延迟加载已禁用,但子记录仍会加载 的相关文章

随机推荐