我首先使用 EF6 代码。有两个表,Lesson
和 LessonSections
。 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
然后我进行第二次调用以将这些部分检索到一个单独的对象中。 (它们必须在单独的对象中,因为我想将它们序列化为 JSON 字符串,并且如果我使用标准 EF,序列化程序会在 Lesson
和 LessonSections
之间的循环引用上停止延迟加载。)
现在我的原始对象有两个部分从数据库加载,即使我从未访问过 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/