如何使用大量数据更新Entity Framework中的多对多关系

时间:2014-04-11 07:23:28

标签: sql entity-framework many-to-many insert-update

关于如何更新与Entity Framework的多对多关系的stackoverflow已经有很多问题,但所有这些关系只使用2-3条记录(例如用户和两个或三个角色)。

在答案中,您会看到加载实体时.Include()的使用情况。

但是,如果有大量的记录,例如50.000 TYPE1和10.000 TYPE2,我该如何更新关系?加载TYPE1及其20.000 TYPE2只是为了向其添加一个TYPE1(反之亦然),效率非常高。

你如何用EF(6)做到这一点?

编辑: 我们使用ObjectContext和Model-First方法进行分离。

1 个答案:

答案 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来执行存储过程。