关于如何更新与Entity Framework的多对多关系的stackoverflow已经有很多问题,但所有这些关系只使用2-3条记录(例如用户和两个或三个角色)。
在答案中,您会看到加载实体时.Include()
的使用情况。
但是,如果有大量的记录,例如50.000 TYPE1
和10.000 TYPE2
,我该如何更新关系?加载TYPE1
及其20.000 TYPE2
只是为了向其添加一个TYPE1
(反之亦然),效率非常高。
你如何用EF(6)做到这一点?
编辑: 我们使用ObjectContext和Model-First方法进行分离。
答案 0 :(得分:1)
无需使用.Include()
加载关系来添加记录。如果您只是添加一个关系,或者甚至是一对夫妻,您可以执行以下操作:
假设您有一个没有其他列的链接表:
Type1 aType1 = dbContext.Type1s.Find(<some type1 id>);
Type2 aType2 = dbContext.Type2s.Find(<some type2 id>);
aType1.Type2Collection.Add(aType2);
dbContext.SaveChanges();
也就是说,如果您的链接表有其他列,那么您可以这样做:
Type1 aType1 = dbContext.Type1s.Find(<some type1 id>);
Type2 aType2 = dbContext.Type2s.Find(<some type2 id>);
TypeRelationships rel = new TypeRelationship()
{
Type1Id = aType1.Id,
Type2Id = aType2.Id,
// Other column values here
};
dbContext.TypeRelationships.Add(rel);
dbContext.SaveChanges();
或者,您只需执行DbContext中的原始SQL语句,如下所示:
dbContext.Database.ExecuteSqlCommand(@"INSERT INTO [dbo].[TypeRelationships] (Type1Id, Type2Id) VALUES (type1Id, type2Id)");
注意:确保在执行此操作时使用参数化值,我只显示要执行的方法。
最后,EF将为每个INSERT语句执行单个查询。如果要插入1000个,请考虑使用表值参数和原始ADO来执行存储过程。