【问题标题】:How to make lazy-loading work with EF Core 2.1.0 and proxies如何使用 EF Core 2.1.0 和代理进行延迟加载
【发布时间】:2018-05-04 17:33:14
【问题描述】:

我有以下型号:

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<Session> Sessions { get; set; }
    public virtual Organization Organization { get; set; }
}

public class Organization
{
    public int OrganizationID { get; set; }

    public virtual ICollection<User> Users { get; set; }
}

在DbContext注册为:

modelBuilder.Entity<Session>(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<User>(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<Organization>(entity =>
{
    entity.ToTable("organizations");

    entity.Property(e => e.OrganizationID).HasColumnName("id");
}

我正在尝试使用 Microsoft.EntityFrameworkCore.Proxies 的延迟加载,如 here 所述:

builder.Register(c =>
{
    var optionsBuilder = new DbContextOptionsBuilder<Context>();
    optionsBuilder
        .UseLazyLoadingProxies()
        /* more options */
        ;

    var opts = optionsBuilder.Options;

    return new Context(opts);
}).As<DbContext>().InstancePerLifetimeScope();

我正在使用context.All&lt;Session&gt; 查询会话。但是,Session.User 和 Session.User.Organization 默认为空。要加载它们,我必须执行context.All&lt;Session&gt;().Include(s =&gt; s.User).Include(s =&gt; s.User.Organization) 之类的操作。我怎样才能避免这种情况?为什么UseLazyLoadingProxies 不起作用?


  • .NET Core 版本:2.1.300-preview2-008533
  • 目标:netcoreapp2.1
  • EF Core(和代理)版本:2.1.0-preview2-final

【问题讨论】:

  • 您是否碰巧找到了解决方案?有同样的问题
  • 说实话,你真的需要延迟加载吗?我用完整的 EF 进行了尝试,发现它不是很有用,因为它只有在你的上下文处于活动状态时才有效,所以如果你只想获取所有信息,你仍然必须手动加载所有属性或保持上下文活动。我为 BuildSession、BuldUser 等 DbSet 创建了扩展方法,其中包含我需要的所有内容。

标签: c# entity-framework asp.net-core .net-core entity-framework-core


【解决方案1】:

在 Asp.net Core 2.1 中使用代理配置延迟加载的步骤

  1. 安装 Microsoft.EntityFrameworkCore.Proxies 包
  2. 启用延迟加载代理 您可以通过调用 UseLazyLoadingProxies 来启用它:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    => optionsBuilder
        .UseLazyLoadingProxies()
        .UseSqlServer(myConnectionString);

或者在使用 AddDbContext 时:

.AddDbContext<BloggingContext>(
b => b.UseLazyLoadingProxies()
      .UseSqlServer(myConnectionString));
  1. EF Core 将为任何可以被覆盖的导航属性启用延迟加载 - 也就是说,它必须是虚拟的。

【讨论】:

    【解决方案2】:

    您可以尝试在Startup.cs 中配置代理

    public void ConfigureServices(IServiceCollection services)
    {
        #region Database configuration
    
        // Database configuration
        services.AddDbContext<DbContext>(options =>
            options.UseLazyLoadingProxies()
                .UseSqlServer(Configuration.GetConnectionString("MyConnectionString")));
    
        #endregion Database configuration
    }
    

    顺便说一句,您已经可以将应用程序包更新到纯 2.1.0(不是最终版本或 RC)。您的配置可能无法正常工作的原因之一是组件版本不稳定。

    注意:Microsoft.EntityFrameworkCore.Proxies.dll 是从 nuget 独立于 EFCore 安装的

    【讨论】:

      【解决方案3】:

      我通过在服务中设置 JSON 序列化来解决这个问题 https://stackoverflow.com/a/49350457/4178475

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-30
        • 2019-08-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多