如何使用EF Core 2.1.0和代理进行延迟加载
我有以下型号:
public class Session { public int SessionID { get; set; } public int UserID { get; set; } public virtual User User { get; set; } } public class User { public int UserID { get; set; } public int OrganizationID { get; set; } public virtual ICollection Sessions { get; set; } public virtual Organization Organization { get; set; } } public class Organization { public int OrganizationID { get; set; } public virtual ICollection Users { get; set; } }
在DbContext
中注册为:
modelBuilder.Entity(entity => { entity.ToTable("sessions"); entity.Property(e => e.SessionID).HasColumnName("id"); entity.Property(e => e.UserID).HasColumnName("user_id"); entity.HasOne(e => e.User) .WithMany(e => e.Sessions) .HasForeignKey(e => e.UserID); } modelBuilder.Entity(entity => { entity.ToTable("users"); entity.Property(e => e.UserID).HasColumnName("id"); entity.Property(e => e.OrganizationID).HasColumnName("organization_id"); entity.HasOne(e => e.Organization) .WithMany(e => e.Users) .HasForeignKey(e => e.OrganizationID); } modelBuilder.Entity(entity => { entity.ToTable("organizations"); entity.Property(e => e.OrganizationID).HasColumnName("id"); }
我正在尝试使用延迟加载Microsoft.EntityFrameworkCore.Proxies
如下所述:
builder.Register(c => { var optionsBuilder = new DbContextOptionsBuilder(); optionsBuilder .UseLazyLoadingProxies() /* more options */ ; var opts = optionsBuilder.Options; return new Context(opts); }).As().InstancePerLifetimeScope();
我正在使用context.All
查询会话。 但是,默认情况下, Session.User
和Session.User.Organization
为null。 要加载它们,我必须做类似context.All().Include(s => s.User).Include(s => s.User.Organization)
。 我怎么能避免这种情况? 为什么UseLazyLoadingProxies
不起作用?
- .NET核心版本:
2.1.300-preview2-008533
- 目标:
netcoreapp2.1
- EF Core(和Proxies)版本:
2.1.0-preview2-final
您可以尝试在Startup.cs
配置代理
public void ConfigureServices(IServiceCollection services) { #region Database configuration // Database configuration services.AddDbContext(options => options.UseLazyLoadingProxies() .UseSqlServer(Configuration.GetConnectionString("MyConnectionString"))); #endregion Database configuration }
顺便说一句,您已经可以将应用程序包更新为纯2.1.0(非最终版或RC版)。 配置可能不起作用的原因之一是组件的不稳定版本。
注意: Microsoft.EntityFrameworkCore.Proxies.dll
是从nuget独立于EFCore安装的
在Asp.net Core 2.1中使用代理配置延迟加载的步骤
- 安装Microsoft.EntityFrameworkCore.Proxies包
-
启用LazyLoadingProxies您可以通过调用UseLazyLoadingProxies来启用它:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)=> optionsBuilder .UseLazyLoadingProxies()。UseSqlServer(myConnectionString);
或者在使用AddDbContext时:
.AddDbContext( b => b.UseLazyLoadingProxies() .UseSqlServer(myConnectionString));
- 然后,EF Core将为任何可以覆盖的导航属性启用延迟加载 – 也就是说,它必须是虚拟的。
- 如何在asp.net核心中编写自定义actionResult
- 无法加载文件或程序集Microsoft.Extensions.DependencyInjection.Abstractions,Version = 1.1.0.0
- 在Linux机器上运行ac#app时,SOAP身份validation失败
- 在部署.net核心应用程序时,HTTP错误500.19,错误代码0x8007000d visual studio 2017
- hosting.json有什么意义,因为appsettings.json就足够了
- 在ASP.NET Core Web API中接收文件和其他表单数据(基于边界的请求解析)
- 是否可以静默运行.NET Core控制台应用程序(隐藏控制台窗口)?
- Store未实现IUserRoleStore ASP.NET Core 2.1 Identity
- 如何在.net核心中执行String.Copy?