【问题标题】:Virtual property not getting loaded after lazy loading too in ASP.NET Core在 ASP.NET Core 中延迟加载后也没有加载虚拟属性
【发布时间】:2019-12-03 19:52:07
【问题描述】:

首先,我阅读了属于这个问题的所有答案,但到目前为止没有任何帮助,所以在将其标记为重复之前阅读一遍。

我创建了一个名为 ProjectMaster 的实体,它有一个名为 ClientMaster虚拟 属性。 当我只在 mvc 中工作时它正在加载数据。但是现在我已经迁移到 CORE 并且这里没有加载。 谷歌搜索后,我知道使用延迟加载加载虚拟属性需要实现两件事。

  • 安装Microsoft.EntityFrameworkCore.Proxies
  • 在启动中的ConfigureServices中调用UseLazyLoadingProxies()服务

我已经完成了这两个步骤以及各种替代方案。 但我仍然无法加载数据。这里我分享了实体和配置服务方法。

实体:

[Table("ProjectMaster")]
public partial class ProjectMaster
{
    [Key]
    public Guid ProjectId { get; set; }

    [Required]
    [StringLength(500)]
    public string ProjectName { get; set; }

    [Required]
    [StringLength(500)]
    public string ProjectCode { get; set; }

    public Guid ClientId { get; set; }

    public Guid CreatedBy { get; set; }

    public virtual ClientMaster ClientMaster { get; set; }
}

[Table("ClientMaster")]
public partial class ClientMaster
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public ClientMaster()
    {
        ProjectMasters = new HashSet<ProjectMaster>();
    }

    [Key]
    public Guid ClientId { get; set; }

    [Required]
    [StringLength(100)]
    public string ClientName { get; set; }

    public Guid CreatedBy { get; set; }

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<ProjectMaster> ProjectMasters { get; set; }
}

启动:

   public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<CookiePolicyOptions>(options =>
        {
            // This lambda determines whether user consent for non-essential cookies is needed for a given request.
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });

        services.AddEntityFrameworkProxies();
        services.AddDbContextPool<ApplicationDBContext>(options =>
        {
            options.UseSqlServer(Configuration.GetConnectionString("amcConn"));
            options.UseLazyLoadingProxies(true);
        });
        //services.AddDbContextPool<ApplicationDBContext>(options => options.UseSqlServer(Configuration.GetConnectionString("amcConn")));
       // services.AddDbContextPool<ApplicationDBContext>(options => options.UseLazyLoadingProxies().UseSqlServer(Configuration.GetConnectionString("amcConn")));


        services.AddSession();
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

    }

控制器:

public ApiResult<List<ProjectMaster>> getallProject()
    {
        try
        {
            AMCContext _contect = new AMCContext();
            return new ApiResult<List<ProjectMaster>>
            (new ApiResultCode(ApiResultType.Success), _contect.ProjectMasters.ToList());
        }

这是我迄今为止所尝试的所有努力。

这里需要注意的是,该实体存在于类库项目中,并且所有必要的包都已加载到其中。

如果你有的话,给我一些有用的建议。

【问题讨论】:

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


    【解决方案1】:

    我目前使用的版本

    <PackageReference Include="Microsoft.EntityFrameworkCore.Proxies" Version="2.2.4" />
    

    使用下面的代码对我有用

    services.AddDbContextPool<ApplicationDbContext>(options =>
     options.UseLazyLoadingProxies()
     .UseSqlServer(configuration.GetConnectionString("DefaultConnection"));
    

    你可以去掉这行代码

    services.AddEntityFrameworkProxies();
    

    示例实体

    public class Post : BaseEntity
    {
        public string Title { get; set; }
        public string ShortDescription { get; set; }
        public string Content { get; set; }
        public PostStatus PostStatus { get; set; }
        public int Views { get; set; }
        public virtual User User { get; set; }
        public virtual ICollection<Comment> Comments { get; set; }
        public virtual Media Medias { get; set; }
    }
    
    public class Comment : BaseEntity
    {
        public string Content { get; set; }
        public virtual Comment ParentComment { get; set; }
        public virtual Post Post { get; set; }
        public virtual User? User { get; set; }
        public CommentStatus CommentStatus { get; set; }
    }
    

    如果我的回答不适合您,您可以使用 Include 尝试类似的方法

       var comments = await _unitOfWork.Repository<Comment>().Query()
                    .Include(x => x.User)
                    .Include(c => c.Post)
                    .Select(x => new CommentViewModel
                    {
                        User = _mapper.Map<User, UserViewModel>(x.User),
                        Post = _mapper.Map<Post, PostViewModel>(x.Post),
                        Comment = _mapper.Map<Comment, CommentDto>(x),
                    })
                    .ToListAsync();
    

    【讨论】:

    • 它可以通过 Include 工作,但会添加急切加载方法。我想通过延迟加载来做到这一点。我已经尝试了你建议的所有方法。
    • 嗯另一件事我可以建议它删除 obj 和调试文件夹然后清理。重新构建并运行您的项目
    • 我已经尝试了您的建议,但也没有用。我不明白为什么这个简单的步骤没有导致我。
    【解决方案2】:

    当您使用延迟加载时,它会在您尝试访问时加载该值 那个物体。您可以为此目的使用 foreach 循环,如图所示 下面:

     var foos = context.Foos.ToList();
     foreach (var Foo in foos )
     {
         var result = Foo.Id;  //This should load the value now
     }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 2017-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多