一般来说,有2个实体:
public class Project
{
public int Id { get; set; }
public string ProjectName { get; set; }
public string ZnName { get; set; }
public virtual ICollection<Task> Tasks { get; set; }
}
public class Task
{
public int Id { get; set; }
public int ProjectId { get; set; }
public string Name { get; set; }
public double? TimePlan { get; set; }
public int? ItemsPlan { get; set; }
public float? ImagesPlan { get; set; }
public virtual Project Project { get; set; }
}
在配置文件中,我设置了它们之间的关系:
builder.HasMany(x => x.Tasks)
.WithOne(x => x.Project)
.HasForeignKey(x => x.ProjectId);
builder
.HasOne(t => t.Project)
.WithMany(p => p.Tasks)
.HasForeignKey(t => t.ProjectId);
我知道设置在一个方向就足够了,然后出于绝望我将它们复制到另一个实体的设置中,因为我认为这会解决问题......
EF Core 最新版本 2。
我在我的存储库中做了这样的事情:
var result = await context.Projects.Include(p => p.Tasks)
.AsNoTracking().ToArrayAsync(cancellationToken);
一些项目留下了一个空的任务集合。
如果您尝试采用一个特定的有问题的项目并将其包含在两个方向:
var project = context.Projects.Where(t => t.Id == 3220).Include(x => x.Tasks).ToList();
var tasks = context.Tasks.Where(t => t.ProjectId == 3220).Include(x=>x.Project).ToList();
一切正常...
这是什么废话?
总的来说,这个错误很愚蠢而且非常不起眼......
在绑定其中一个实体时,他们忘记了它有一个复合 PK,并指出 PK 只是一个 ID。正因为如此,他在选拔过程中风风雨雨……
最有趣的是,EF 默默地从表中读取数据,他并不关心标记为 PK 的字段在绑定中有重复...
很可能是设置上下文的错误。没有找到其他人。