ObjectContext.SaveChanges и дубликат первичного ключа - PullRequest
3 голосов
/ 06 марта 2011

У меня есть любимый проект, написанный на php.Одно из заданий, которые выполняет мой код, - это загрузить кучу CSV-файлов и записать их в таблицу MySQL, в которой есть как автоматически сгенерированный первичный ключ, так и составной уникальный ключ.У меня нет контроля и способов проверить, какой файл уже обработан, поэтому пригодился уникальный ключ.Я вставляю данные в таблицу с помощью INSERT IGNORE, который молча завершается сбоем, когда я пытаюсь вставить данные, которые уже существуют, и все работает отлично, как и должно.

Теперь я пытаюсь создать аналогичный проект в C # 4, используя LINQ ToОбъекты, но когда я пытаюсь вызвать метод ObjectContext.SaveChanges() для объектов из файлов, которые уже находятся в таблице, UpdateException выбрасывается с SqlClient.SqlException как внутреннее исключение.Одним из решений было добавление Ignore Duplicate Keys = Yes в индекс, и это вроде работает, но

  • Это изменение на сервере, а не на клиенте
  • При обновлении с существующим индексом

1 Ответ

1 голос
/ 24 декабря 2011

Другое решение будет примерно таким:

public void SaveAll( IEnumerable<Entity> entities )
{
    var ids = entities.Select(x => x.Id).ToList();
    var idsToRemove = context.Entities.Where(x => ids.Contains(x.Id)).Select(x => x.Id).ToList();
    var entitiesToInsert = entities.Where(x => !idsToRemove.Contains(x.Id));

    foreach(var entity in entitiesToInsert)
        context.Entities.AddObject(entity);
}
...