.Net EF AddRange对象列表显示为多个查询

时间:2018-03-06 19:08:45

标签: .net list entity-framework linq addrange

我的理解是,要轻松地将对象列表添加到数据库,您可以将它们添加到列表中,然后只需调用AddRange,然后调用SaveChanges即可在一个查询中完成此操作。我们正在使用分析器,并且看到它将列表中的所有项目转换为单独的插入语句。

我的想法是关于AddRange如何工作还是有其他问题?我真的以为我会看到一个单独的插入语句,而不是列表中有很多项。

在下面的代码中,我们添加了一个LearningPath,然后在此学习路径中添加课程。起初我以为它可能与每个LearningPathLesson查询找到LessonPathId有关,但是当我移动它时仍然没有解决问题。

    public static void SaveLearningPath(LearningPathSaveModel model)
    {
        using (var db = new ServerDBEntities())
        {
            var now = DateTimeOffset.Now;
            var learningPath = new LearningPath()
            {
                Id = string.IsNullOrEmpty(model.id) ? Guid.NewGuid().ToString() : model.id,
                Name = model.name,
                Created = now,
                Updated = now
            };

            if (model.defaultLearningPath)
            {
                learningPath.IsDefault = true;
                var previousDefault = db.LearningPaths.FirstOrDefault(l => l.IsDefault == true);
                if (previousDefault != null)
                {
                    previousDefault.IsDefault = false;
                }
            }

            db.LearningPaths.Add(learningPath);
            db.SaveChanges();

            string lpId = learningPath.Id;

            var learningPathLessons = new List<LearningPathLesson>();
            for (var i = 0; i < model.lessonIdsInLearningPath.Count; ++i)
            {
                var id = model.lessonIdsInLearningPath[i];
                learningPathLessons.Add(new LearningPathLesson()
                {
                    Id = Guid.NewGuid().ToString(),
                    LessonId = id,
                    LearningPathId = lpId,
                    Order = i + 1,
                    Created = now,
                    Updated = now
                });
            }

            //db.LearningPaths.Add(learningPath);
            db.LearningPathLessons.AddRange(learningPathLessons);
            db.SaveChanges();
        }
    }

enter image description here

1 个答案:

答案 0 :(得分:0)

实体框架的行为是每次添加生成一个插入。

您可以使用第三方库(不是免费的)

http://entityframework-extensions.net/bulk-insert

进行批量插入

context.BulkInsert(list);