如何向DbSet添加实体列表

时间:2012-02-12 01:49:33

标签: .net entity-framework

DbSet.Add()将单个实体添加到DbSet。但是没有DbSet.AddRange()来添加实体列表。有没有我可以直接从EF调用的方法,允许我添加一个实体列表?如果没有,EF有什么理由不提供这样的方法吗?

2 个答案:

答案 0 :(得分:11)

在EF6中,DbSet.AddRangeDbSet.RemoveRange都可用。

实施它们的原因是为了提高性能,通过为每个添加或删除实体禁用DetectChanges来完成的工作。

更多详情:

注意:此方法仍然没有官方文档,因为EF仍然是RC1。

更新:EF6已经发布,the official documentation for .AddRange() is here,但是上面的链接中有关于它内部发生的事情的解释。

答案 1 :(得分:6)

Eranga的评论可以说是正确的。我想真正关心的是如果基础表的密钥是标识列,如果列表中的任何实体都设置了密钥属性,应该怎么做:

  • 抛出异常? OR
  • 将密钥设置为零,以便插入具有不同密钥的新实体? OR
  • 使用相同的密钥更新实体?

出于这个原因,将AddRange()实现到泛型类DbSet并没有多大意义。如果你想要一些特别符合你需要的东西,你可以扩展DbSet如下

   public static class EFExtension 
   {

      public static void AddRange<TEntity>(this DbSet<TEntity> dbSet, IList<TEntity> entities) where TEntity : class
      {
        foreach (TEntity e in entities)
        {
            dbSet.Add(e);
        }
     }
  }