EntityFramework在不具体化集合的情况下更新“多对多”
本文关键字:多多 多对多 更新 情况下 具体化 集合 EntityFramework | 更新日期: 2023-09-27 18:21:47
我用多对多关系链接了两个实体Project
、Train
。现在,我想将现有的Train
添加到Project.Trains
。不幸的是,该集合有很多条目。当我写project.Trains.Add(...)
时,它具体化了整个集合,这需要很多时间。有没有办法告诉EF,我想在不具体化集合的情况下将Train添加到项目中,以便行动更快?
假设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
实体,并设置Train
和Project
属性