我遇到一个问题,即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
属性。
是否有一种方法可以阻止这种自动填充,除非包含文件中有明确说明?
感谢您的帮助。