EntityFramework 在不具体化集合的情况下更新多对多

EntityFramework update Many to Many without materializing the collection

我已将 2 个实体 ProjectTrain 链接为多对多关系。 现在,我想将现有的 Train 添加到 Project.Trains。不幸的是,该集合有很多条目。当我写 project.Trains.Add(...) 时,它实现了完整的集合,这需要很多时间。有没有办法告诉 EF 我想在不具体化集合的情况下将火车添加到项目中,以便操作更快?

您可以:

1- 关闭延迟加载。这样,访问 Trains 不会产生 查询数据库。但要注意副作用,因为你可能有 已经依赖了。

2-接近关系数据库世界:将FK属性添加到Train实体上并设置在新创建的实体上 对象:

    newTrain.ProjectId = project.Id

3- 更接近关系数据库世界:添加 junction table ProjectTrain,实现多对多关系

   public class ProjectTrain
   {
        public int Id {get;set;}
        public Project Project {get;set;}
        public Train Train {get;set;}
   }

并将其添加到上下文中:

DBSet<ProjectTrain> ProjectTrains {get;set;}

最后,创建 ProjectTrains 的新实体并设置 TrainProject 属性

假设 Train.Projects 集合比 Project.Trains 集合有 更少的 项,一个快速的解决方案是将 Project 添加到Train 而不是相反:

train.Projects.Add(project);

是的,有一种方法可以做到,但这非常困难,而且需要深入 EF 的内部。如果您使用 EF 生成的代理,它们通常会实现 IEntityWithRelationships。您将能够以

的身份访问客户经理
var entityWithRelationships = project as IEntityWithRelationships;
var relatedEnd = entityWithRelationships.RelationshipManager.GetRelatedEnd("RelationshipName as found in Metadata");

使用此设置,您应该能够按如下方式添加 Train

context.Trains.Add(train);
relatedEnd.Add(train);

如前所述,要让它发挥作用还有很长的路要走,但它会解决你的问题。