Оптимальный способ добавления / обновления объектов EF, если добавленные элементы могут существовать или могут не существовать - PullRequest
2 голосов
/ 18 августа 2011

Мне нужно руководство по добавлению / обновлению записей SQL с использованием EF. Допустим, я пишу приложение, которое хранит информацию о файлах на жестком диске в базе данных EF4. Когда вы нажимаете кнопку, она сканирует все файлы по указанному пути (может быть, весь диск) и сохраняет в базе данных такую ​​информацию, как размер файла, дата изменения и т. Д. Иногда файл уже будет записан с предыдущего запуска, поэтому его свойства должны быть обновлены; иногда пакет файлов будет обнаружен в первый раз, и его необходимо будет добавить.

Я использую EF4 и ищу наиболее эффективный способ добавления новой информации о файле и обновления существующих записей. Насколько я понимаю, когда я нажимаю кнопку поиска и файлы обнаруживаются, мне придется проверять наличие файловой сущности, извлекать ее поле идентификатора и использовать ее для добавления или обновления связанной информации; но если он еще не существует, мне нужно будет создать дерево, которое представляет его и связанные с ним объекты (например, путь к папке), и добавить его. Мне также придется обрабатывать слияние объекта пути к папке.

Мне приходит в голову, что если существует много миллионов файлов, как это может быть на сервере, загрузка всей базы данных в контекст не идеальна и не практична. Таким образом, для каждого файла, возможно, мне придется совершить круговую поездку к базе данных на диске, чтобы определить, существует ли уже запись, получить ее идентификатор, если она существует, а затем еще одну поездку для обновления. Есть ли более эффективный способ вставить / обновить несколько файловых объектов в одной поездке в БД? Если бы существовал метод контекста Entity, например, «Вставить, если он не существует, и обновить, если он есть», то я мог бы заключить несколько транзакций в транзакцию?

Я предполагаю, что это будет довольно распространенным требованием, как это лучше всего сделать в EF? Любые мысли будут оценены. (О, моя БД SQLITE, если это имеет значение)

1 Ответ

1 голос
/ 01 июня 2012

Вы можете проверить, существует ли запись в БД.Если нет, создайте и добавьте запись.Затем вы можете установить поля записи, которые будут общими для вставки и обновления, как пример кода ниже.

           var strategy_property_in_db = _dbContext.ParameterValues().Where(r => r.Name == strategy_property.Name).FirstOrDefault();
            if (strategy_property_in_db == null)
            {
                strategy_property_in_db = new ParameterValue() { Name = strategy_property.Name };
                _dbContext.AddObject("ParameterValues", strategy_property_in_db);
            }
            strategy_property_in_db.Value = strategy_property.Value;
...