向我的Visual Studios请求鞠躬,我使用Entity Framework Core(1.0.1)
启动了我的最新项目所以编写我的数据库模型,因为我总是使用'virtual'说明符来启用List的延迟加载。虽然在加载父表时,似乎子目录永远不会加载。
父模型
public static void Message()
{
PageSource = driver.getPageSource();
// set up Array of search strings
List<String> searchText = new ArrayList<String>();
searchText.add("Test1");
searchText.add("Test2");
searchText.add("Test3");
// loop through Array looking for each string contained
for (String text : searchText)
{
if (PageSource.contains(text))
{
System.out.println("Found: <" + text + ">");
return;
}
}
System.err.println("No Match");
}
儿童模型
public class Events
{
[Key]
public int EventID { get; set; }
public string EventName { get; set; }
public virtual List<EventInclusions> EventInclusions { get; set; }
}
向这些表添加新记录似乎可以正常工作,因为我习惯于将EventInclusions记录嵌套在Events记录中作为List。
虽然我查询此表
public class EventInclusions
{
[Key]
public int EventIncSubID { get; set; }
public string InclusionName { get; set; }
public string InclusionDesc { get; set; }
public Boolean InclusionActive { get; set; }
}
问题
无论幕后数据如何,EventInclusions都将返回空值。
读了一下后,我感觉这是我通常使用的EF6和EF Core之间的变化
我可以使用一些帮助来制作一个随机的Lazy Loading on语句,或者找出用于指定延迟加载的新格式。
CAZ
答案 0 :(得分:31)
所以看来EF Core目前不支持延迟加载。它的到来但可能还有一段时间。
现在,如果有其他人遇到这个问题并且正在挣扎。以下是使用 Eager loading 的演示,这是您现在必须使用的。
在您拥有一个人物对象之前说,该对象在另一个表中包含一个帽子列表。
而不是写
var person = _context.Person.Where(p=> p.id == id).ToList();
person.Hats.Where(h=> h.id == hat).ToList();
您需要撰写
var person = _context.Person.Include(p=> p.Hats).Where(p=> p.id == id).ToList();
然后person.Hats.Where(h=> h.id == hat).ToList();
将起作用
如果您有多个列表 - 链接包含
var person = _context.Person.Include(p=> p.Hats).Include(p=> p.Tickets)
.Include(p=> p.Smiles).Where(p=> p.id == id).ToList();
我有点理解为什么这种方法更安全,你没有加载可能减慢速度的大数据集。但是我希望他们能尽快让Lazy回来!!!
Caz
答案 1 :(得分:27)
EF Core 2.1
现在提供延迟加载,此处链接指向相关文档:
https://docs.microsoft.com/en-us/ef/core/querying/related-data#lazy-loading
答案 2 :(得分:14)
您可以安装此软件包以在EF Core 2.1中启用延迟加载。
Microsoft.EntityFrameworkCore.Proxies
,然后在您的ef dbContext中设置此配置
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
.UseLazyLoadingProxies()
.UseSqlServer("myConnectionString");
“注意”,此程序包适用于EF Core 2.1。
答案 3 :(得分:6)
刚出现了pre-release version,不管它是否应该很快就会完整发布。
有几点需要注意:
此行会隐藏在您的数据上下文的OnConfiguring中:
optionsBuilder.UseLazyLoadingProxies();
答案 4 :(得分:4)
EF Core尚不支持LazyLoading,但是有一个非官方库可以启用LazyLoading:https://github.com/darxis/EntityFramework.LazyLoading。您可以使用它,直到它得到官方支持。 它支持EF Core v1.1.1。它以nuget包的形式提供:https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.LazyLoading/
免责声明:我是此回购的所有者,并邀请您试用,报告问题和/或做出贡献。
答案 5 :(得分:2)
延迟加载计划在EF核心2.1中 - 您可以详细了解它为什么是必备功能 - here。
答案 6 :(得分:1)
对于EF Core 2.1及更高版本,
安装:
dotnet add package Microsoft.EntityFrameworkCore.Proxies --version 2.2.4
然后按如下所示更新您的Startup.cs文件。
using Microsoft.EntityFrameworkCore.Proxies;
services.AddEntityFrameworkProxies();
services.AddDbContext<BlogDbContext>(options =>
{
options.UseSqlite(Configuration.GetSection("ConnectionStrings")["DefaultConnection"]);
options.UseLazyLoadingProxies(true);
});