Sql foreach外部的SaveChanges()只保存最后添加的对象

Sql foreach外部的SaveChanges()只保存最后添加的对象,sql,entity-framework,foreach,console-application,Sql,Entity Framework,Foreach,Console Application,SaveChanges()似乎只保存添加到表中的最后一个对象: static void Main(string[] args) { Category c = new Category(); using (GenericDBEntities db = new GenericDBEntities()) { foreach (Match i in db.Matches) {

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,如果它不在类别表中,则添加它,这样它就不会再次存储重复项,问题是类别表最初是空的,因此新手逻辑仍在学习中

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

如果要根据
CategoryId
添加
Matches
中的所有新类别,可以使用以下方法:

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();
}

现在,您将一次性从
匹配项
表中获得所有新类别。这是初稿,意味着性能可以在需要时进一步调整。

哇,你做得很好!我以为有一个LINQ的方法可以做到这一点,只是这对我来说仍然是复杂的想法…谢谢,真的很感谢你的帮助!