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

本文关键字:多多 多对多 更新 情况下 具体化 集合 EntityFramework | 更新日期: 2023-09-27 18:21:47

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

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

假设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);

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

您可以:

1-关闭延迟加载。这样,访问Trains不会产生查询到DB。但要注意副作用,因为你可能有

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

    newTrain.ProjectId = project.Id

3-更接近关系数据库世界:添加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属性