假设我有以下两个类,它们将表示2个DB表(使用EF Core迁移创建(之间的关系:
public class Author
{
public int Id { get; set; }
public string Name { get; set; }
public Book Book { get; set; }
}
public class Book
{
public int Id { get; set; }
public String name { get; set; }
public string Genre { get; set; }
}
这两个类作为DbSet
添加到我的ApplicationDbContext
类中。
当我检索Author
记录时,我希望Book
对象也被填充信息。似乎我必须以以下方式检索它:
return _context.Author.Include(x => x.Book).ToList();
如果我在Author
类中有十几个不同的对象,这是否意味着我必须为每个对象链式调用.Include()
方法?是否有一个catch-all方法可以告诉我填充Author
类中的所有对象?也许是.IncludeAll()
之类的?
您可以使用EF核心上启用的延迟加载。这样你就不需要每次都包含它。
基本上你需要添加虚拟关键字到你的书实体:
public class Author{
public int Id {get; set;}
public string Name {get; set; }
public virtual Book Book {get; set; }
}
public class Book {
public int Id {get; set;}
public String name {get; set;}
public string Genre {get; set; }
}
然后,您需要通过安装Microsoft.EntityFrameworkCore.Proxy包并通过调用UseLazyLoadingProxies来启用延迟加载。例如:在startup.cs类中,将dbcontext修改为以下
services.AddDbContext<BloggingContext>(
b => b.UseLazyLoadingProxies()
.UseSqlServer(myConnectionString));
请参阅以下链接以了解延迟加载是如何工作的https://learn.microsoft.com/en-us/ef/core/querying/related-data