SaveChanges () вне foreach сохраняет только последний добавленный объект - PullRequest
0 голосов
/ 25 февраля 2019

Кажется, что 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, и, если ее еще нет в таблице категорий, добавить ее, чтобы онане будет хранить дубликаты снова, проблема в том, что таблица категорий изначально пуста, поэтому логика новичка все еще учится!

1 Ответ

0 голосов
/ 26 февраля 2019

Вам необходимо создать объект 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 стол за один раз.Это первый проект, означающий, что при необходимости можно дополнительно настроить производительность.

...