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