上下文使用后,EF Core会自动填充相关数据

时间:2019-04-01 00:04:34

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

我遇到一个问题,即EF Core将根据先前语句中上下文所调用的内容获取额外的数据。例如,假设我具有EF Core从相应的SQL表生成的以下类。

Project.cs

public class Project 
{
    public Project()
    {
        Packages = new HashSet<Package>();
    }

    public int ID { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Package> Packages { get; set; }
}

User.cs

public class User
{
    public User()
    {
        Packages = new HashSet<Package>();
    }

    public int ID { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Package> Packages { get; set; }
}

Package.cs

public class Package
{
    public int ID { get; set; }
    public string Name { get; set; }
    public int ProjectID { get; set; }
    public int UserID { get; set; }

    public virtual Project Project { get; set; }
    public virtual User User { get; set; }
}

ExampleContext.cs

public class ExampleContext : DbContext
{
    public ExampleContext() 
    {
    }

    public ExampleContext(DbContextOptions<ExampleContext> options) : base(options)
    {
    }

    public DbSet<Project> Projects { get; set; }
    public DbSet<Package> Packages { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Project>(entity => 
        {
            entity.HasKey("ID");
        }

        modelBuilder.Entity<User>(entity =>
        {
            entity.HasKey("ID");
        }

        modelBuilder.Entity<Package>(entity =>
        {
            entity.HasKey("ID");

            entity.HasOne(d => d.Project)
                .WithMany(p => p.Packages)
                .HasForeignKey(d => d.ProjectID)
                .OnDelete(DeleteBehavior.ClientSetNull)
                .HasConstraintName("FK_Package_Project");

            entity.HasOne(d => d.User)
                .WithMany(p => p.Packages)
                .HasForeignKey(d => d.UserID)
                .OnDelete(DeleteBehavior.ClientSetNull)
                .HasContraintName("FK_Package_User");
        }
    }
}

所以现在发生的是如果我有一个控制器动作,如:

public IActionResult GetProjects()
{
    var projects = _context.Projects.Include(p => p.Packages).ToList();
    var users = _context.Users.ToList();
}

第一行将获取所有项目,并为每个项目获取Packages的集合。如果您进一步看,您会注意到所有这些软件包也都填满了它们的Project。然后再往前看,您会发现该项目具有Packages ...的集合,依此类推。但是,每个软件包的User将为空。

第二行运行时,您不仅会返回用户列表。但是,即使没有调用include方法,每个用户也会填写其Packages的集合。更重要的是,您会发现projects变量中每个项目中的软件包现在都已正确填充了其关联的User属性。

是否有一种方法可以阻止这种自动填充,除非包含文件中有明确说明?

感谢您的帮助。

0 个答案:

没有答案