Caz*_*224 34 c# entity-framework-core
鞠躬我的Visual Studios请求,我使用Entity Framework Core(1.0.1)启动了我的最新项目
所以编写我的数据库模型,因为我总是使用'虚拟'说明符来启用List的延迟加载.虽然在加载父表时,似乎子目录永远不会加载.
父模型
public class Events
{
[Key]
public int EventID { get; set; }
public string EventName { get; set; }
public virtual List<EventInclusions> EventInclusions { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
儿童模特
public class EventInclusions
{
[Key]
public int EventIncSubID { get; set; }
public string InclusionName { get; set; }
public string InclusionDesc { get; set; }
public Boolean InclusionActive { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
向这些表添加新记录似乎可以正常工作,因为我习惯于将EventInclusions记录嵌套在Events记录中作为List.
虽然当我查询这个表
_context.Events.Where(e => e.EventName == "Test")
Run Code Online (Sandbox Code Playgroud)
问题
无论幕后数据如何,EventInclusions都将返回空值.
读了一下后,我感觉这是我通常使用的EF6和EF Core之间的变化
我可以使用一些帮助来制作一个毯子上的Lazy Loading语句,或者找出指定Lazy Loading的新格式.
CAZ
Caz*_*224 35
所以看来EF Core目前不支持延迟加载.它的到来但可能还有一段时间.
现在如果有其他人遇到这个问题并且正在挣扎.下面是使用Eager加载的演示,这是您现在必须使用的.
在你有一个person对象之前说,那个对象包含另一个表中的Hats List.
而不是写作
var person = _context.Person.Where(p=> p.id == id).ToList();
person.Hats.Where(h=> h.id == hat).ToList();
Run Code Online (Sandbox Code Playgroud)
你需要写
var person = _context.Person.Include(p=> p.Hats).Where(p=> p.id == id).ToList();
Run Code Online (Sandbox Code Playgroud)
然后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();
Run Code Online (Sandbox Code Playgroud)
我有点理解为什么这种方法更安全,你没有加载可能减慢速度的大数据集.但是我希望他们很快就能让Lazy回来!
CAZ
Eli*_*ren 33
现在可以使用延迟加载EF Core 2.1,这里是相关文档的链接:
https://docs.microsoft.com/en-us/ef/core/querying/related-data#lazy-loading
小智 19
您可以安装此程序包以在EF Core 2.1中启用延迟加载.
Microsoft.EntityFrameworkCore.Proxies
Run Code Online (Sandbox Code Playgroud)
然后在您的ef dbContext中设置此配置
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
.UseLazyLoadingProxies()
.UseSqlServer("myConnectionString");
Run Code Online (Sandbox Code Playgroud)
"注意"此程序包适用于EF Core 2.1.
有一个刚刚发布的预发布版本,无论它是否应该很快就可以完整发布.
几点需要注意:
此行包含在您的数据上下文中的OnConfiguring:
optionsBuilder.UseLazyLoadingProxies();
Run Code Online (Sandbox Code Playgroud)小智 6
对于EF Core 2.1及更高版本,
安装:
dotnet add package Microsoft.EntityFrameworkCore.Proxies --version 2.2.4
Run Code Online (Sandbox Code Playgroud)
然后如下所示更新您的Startup.cs文件。
using Microsoft.EntityFrameworkCore.Proxies;
services.AddEntityFrameworkProxies();
services.AddDbContext<BlogDbContext>(options =>
{
options.UseSqlite(Configuration.GetSection("ConnectionStrings")["DefaultConnection"]);
options.UseLazyLoadingProxies(true);
});
Run Code Online (Sandbox Code Playgroud)
EF Core 尚不支持 LazyLoading,但有一个非官方库可以启用 LazyLoading: https: //github.com/darxis/EntityFramework.LazyLoading。您可以使用它,直到得到正式支持为止。它支持 EF Core v1.1.1。它可以作为 nuget 包提供:https ://www.nuget.org/packages/Microsoft.EntityFrameworkCore.LazyLoading/
免责声明:我是此存储库的所有者,并邀请您尝试、报告问题和/或做出贡献。