首页 > 解决方案 > foreach 之外的 SaveChanges() 仅保存添加的最后一个对象

问题描述

似乎 SaveChanges() 只保存添加到表中的最后一个对象:

  static void Main(string[] args)
    {
        Category c = new Category();

        using (GenericDBEntities db = new GenericDBEntities())
        {

            foreach (Match i in db.Matches)
            {
                if (!db.Categories.Any())
                {
                    c.CategoryInternalId = i.CategoryId;
                    c.CategoryName = i.CategoryName;
                    c.SportId = i.SportId;
                    db.Categories.Add(c);
                }
                else
                {
                    foreach (Category a in db.Categories)
                    {
                        if (i.CategoryId != a.CategoryInternalId)
                        {
                            c.CategoryInternalId = i.CategoryId;
                            c.CategoryName = i.CategoryName;
                            c.SportId = i.SportId;
                            db.Categories.Add(c);
                        }
                        else
                        {
                            return;
                        }
                    }
                }
            }

            db.SaveChanges();

我已经尝试了几种不同的方法,它们都具有相同或更少的结果,无论是否满足条件,for循环都会将它们全部保存。为什么它只保存匹配表的最后一个对象?我错过了什么?

澄清:任务是通过匹配表,它有重复的 CategoryID,如果它还没有在 Category 表中,则添加它,所以它不会再次存储重复项,问题是 Category 表最初是空的,因此新手逻辑,还在学习中!

标签: sqlentity-frameworkforeachconsole-application

解决方案


您需要Category为每个插入的类别创建对象,否则您只有一个一直在编辑的类别对象,因此只有这个(最后一次编辑)将保存到数据库中。

如果要添加所有新类别,Matches可以CategoryId使用以下内容:

using (GenericDBEntities db = new GenericDBEntities())
{
     var newCategories = db.Matches
        .Where(m => !db.Categories
            .Select(c => c.CategoryInternalId)
            .Distinct().Contains(m.CategoryId))
        .Select(m => new { m.CategoryId, m.CategoryName, m.SportId })
        .GroupBy(m => m.otherid)
        .Select(g => g.FirstOrDefault())
        .ToList();

    foreach (var i in newCategories)
    {
        var c = new Category() 
        { 
            CategoryInternalId = i.CategoryId,
            CategoryName = i.CategoryName,
            SportId = i.SportId
        };
        db.Categories.Add(c);
    }

    db.SaveChanges();
}

现在,您将Matches一次性从表中获取所有新类别。这是初稿,这意味着如果需要,可以进一步调整性能。


推荐阅读