EntityFramework 在不具体化集合的情况下更新多对多
EntityFramework update Many to Many without materializing the collection
我已将 2 个实体 Project
、Train
链接为多对多关系。
现在,我想将现有的 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
的新实体并设置 Train
和 Project
属性
假设 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);
如前所述,要让它发挥作用还有很长的路要走,但它会解决你的问题。
我已将 2 个实体 Project
、Train
链接为多对多关系。
现在,我想将现有的 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
的新实体并设置 Train
和 Project
属性
假设 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);
如前所述,要让它发挥作用还有很长的路要走,但它会解决你的问题。