foreach之外的SaveChanges()仅保存最后添加的对象

时间:2019-02-25 19:46:00

标签: sql entity-framework foreach console-application

似乎SaveSaves()仅保存最后添加到表中的对象:

  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表最初是空的,因此新手逻辑仍然在学习!!

1 个答案:

答案 0 :(得分:1)

您需要为每个插入的类别创建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表中获得所有新类别。这是初稿,这意味着可以根据需要进一步调整性能。