繁体   English   中英

为什么实体框架核心加载实体的关系而不添加包含

[英]Why is Entity Framework core loading entity's relations without adding include

我在 .net 核心项目中使用 EF 核心。 从 ef 上下文中获取数据后,对象的实体(一对多等)会自动加载。

这是我的代码:

 public TimeSheetActivity Get(int id)
 {
     DataSets.TimeSheetActivity dbActivity = db.TimeSheetActivities
                                               .Include(k => k.ProjectFile)
                                               .Include(k => k.MeasurementUnit)
                                               .Include(k => k.TypeOfWork)
                                               .Include(k => k.TimeSheetProject)
                                               .FirstOrDefault(k => k.ID == id);

     return dbActivity == null ? null : _mapper.Map<TimeSheetActivity>(dbActivity);
 }


public Project GetActivityProject(int id)
{
    //db.SaveChanges();

    TimeSheetActivity activity = Get(id);

    if (activity == null)
    {
        return null;
    }

    var dbTimeSheetProject = db.TimeSheetProjects.First(k => k.ID == activity.TimeSheetProjectId);

    var dbProject = db.Projects.First(k => k.ID == dbTimeSheetProject.ProjectId);
    // PROBLEM HERE >> dbProject is loading all entities related
    return _mapper.Map<Project>(dbProject);
}

问题在上面标记并在Projects上下文中进行了注释,这里是项目 class:

public class Project
    {
        public int ID { get; set; }
        public string Title { get; set; }
        public string Description { get; set; }
        public DateTime DateAdded { get; set; }

        public int? ParentId { get; set; }
        public int? DepartmentId { get; set; }
        public int? CompanyId { get; set; }


        public virtual Department Department { get; set; }
        public virtual Company Company { get; set; }

        public virtual Project Parent { get; set; }

        public virtual List<Project> Activities { get; set; }
        public virtual List<TimeSheetProject> TimeSheetProjects { get; set; }
        public virtual List<ProjectFile> ProjectFiles { get; set; }

    }

调试捕获:

调试

我认为问题是这样的(摘自文档):

Entity Framework Core 将自动修复先前加载到上下文实例中的任何其他实体的导航属性。 因此,即使您没有明确包含导航属性的数据,如果之前加载了部分或所有相关实体,该属性仍可能会被填充。

https://docs.microsoft.com/en-us/ef/core/querying/related-data#eager-loading

你应该使用ICollection而不是List

试试这个代码:

 public virtual ICollection<Project> Activities { get; set; }
 public virtual ICollection<TimeSheetProject> TimeSheetProjects { get; set; }
 public virtual ICollection<ProjectFile> ProjectFiles { get; set; }

也许您在代码中使用Microsoft.EntityFrameworkCore.Proxies package

这就是将代理添加到您的项目的方式。 仔细检查它是否使用过

 services.AddDbContextPool<ApplicationDbContext>(options =>
    options.UseLazyLoadingProxies().UseSqlServer(configuration.GetConnectionString("DefaultConnection"),
        b => b.MigrationsAssembly("AwesomeCMSCore")).UseOpenIddict());

还尝试删除 virtual 关键字,然后再次运行迁移。

关于@cristi71000 的回答,情况就是这样。 我的解决方案是添加AsNoTracking()如下:

var dbProject = db.Projects.AsNoTracking()...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM