为了演示这个问题,我有以下代码(首先是db上下文)。不要担心模型,它在概念上是没有意义的,因为它只是为了演示这个问题。
public class SubjectsDbContext : DbContext
{
public virtual DbSet<Subject> Subjects { get; set; }
public SubjectsDbContext(string connectionString) : base(connectionString)
{
}
public SubjectsDbContext()
{
}
}
public class Subject
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid SubjectId { get; set; }
[Required]
public virtual Course EnrolledCourse {get;set;}
[Required]
[Column(TypeName = "varchar")]
[StringLength(64)]
public string FullName { get; set; }
}
[Table("Courses")]
public class Course
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid CourseId { get; set; }
[Required]
public string CourseName { get; set; }
}
}
我可以创建新的条目,好的,数据按照预期正确地进入数据库。
然而,如果我试图通过
dbContext.Subjects
我正确地获得了一个列表,但是当我访问Subject对象时
dbContext.Subjects.First()
课程成员字段为空。有什么问题吗?
在调试器中,我得到了这个错误。
((System.Data.Entity.DynamicProxies.Subject_6FCD2FAC29425D72CDE4D879DA7F242F07267C22C94FFE2051F99B13F76C6637)subject).EnrolledCourse‘'System.Data.Entity.Core.EntityCommandExecutionException类型的异常
发布于 2020-01-12 15:25:54
首先,我假设成员字段为null,而不是抛出异常。“已经有一个与此命令相关联的开放DataReader”。
结果,我在sql连接字符串中丢失了MultipleActiveResultSets=true。
发布于 2020-01-12 15:27:48
这是我们正在讨论的懒散加载和急切加载。
当第一次读取实体时,它只读取实体,而不读取任何相关数据(实体)。从技术上讲,这会导致发送到数据库的多个查询。伊格-
dbContext.Subjects;
急切地加载.当您读取实体时,相关的数据也会随之被检索。这只执行一个检索所有所需数据的Sql查询。您可以通过使用Include方法指定急切的加载。
var subjects= context.Subjects
.Include(s ⇒ s.Courses).ToList();
您需要使用热切加载,以便将课程作为查询的一部分加载。
注意:延迟加载和急切加载是实体框架中非常强大的概念。需要适当地使用它们,以达到良好的性能和效率。
https://stackoverflow.com/questions/59708814
复制