Справочная информация: Я работаю над проектом, в который импортирую группу данных из файла CSV в базу данных с использованием .NET Entity Framework (v4.1).Во время импорта я ожидаю увидеть много «ошибок» (т. Е. Ошибок поиска), возможно, несколько в каждой строке, и они должны быть позже разрешены администратором посредством ручного процесса.Многие ошибки одинаковы для каждой строки (т. Е. Один и тот же столбец, одно и то же значение данных и один и тот же код ошибки, но разные строки), поэтому, чтобы администратору было легче их разрешать, я их объединяю.Другими словами, при вставке данных строки, если я сталкиваюсь с ошибкой, которая была замечена ранее в другой строке, я связываю новую строку с этой ошибкой вместо вставки новой.Я использую хеш-таблицу для быстрого поиска.
Моя модель выглядит следующим образом:
- Каждый файл представлен ImportFile объектом
- Каждый ImportFile имеет коллекцию ImportErrors (один ко многим)
- Каждый ImportFile также имеет коллекцию DataRows (один ко многим)
- Между DataRows и ImportErrors существует отношение «многие ко многим», так что у каждого есть коллекция другого.
Моя загадка: У меня работает коди вставка всех этих данных в базу данных должным образом, но когда размер файла импорта начинает превышать, скажем, несколько сотен строк, производительность ужасна.Я уверен, что это происходит из-за отслеживания изменений, которое осуществляется Entity Framework за кулисами.Я бы хотел отключить отслеживание изменений, чтобы повысить производительность, но если я это сделаю, я не вижу способа заставить Entity Framework вставлять записи соединения между DataRows и ImportErrors.Как я уверен, вы знаете, Entity Framework не генерирует сущность для представления объединения;вместо этого он проверяет, добавили ли вы элементы в соответствующие коллекции на соединенных объектах.
Итак, кто-нибудь знает способ обойти это?Есть ли способ явно указать платформе сущностей на вставку записи соединения?Или есть лучший способ сделать это?
В настоящее время я использую один DbContext для всего импорта.Я создаю все объекты, добавляя их в контекст по ходу работы, а затем в конце делаю один SaveChanges ().
Другие вещи, которые я пробовал:
- Более частый вызов SaveChanges () (по одному разу в строке) - это делало вещи еще медленнее
- Попытка использовать новый DbContext для каждого DataRow - в этом случае структура сущности жаловалась, что «связьмежду этими двумя объектами нельзя определить, потому что они прикреплены к разным объектам ObjectContext. "Ошибка не говорит, какие конкретные объекты она пыталась связать в то время.Я пробовал это несколькими способами, и я не могу сделать EF счастливым, независимо от того, что я делаю с этим подходом.
Другие подходы, которые я рассматриваю, но еще не пробовали:
- Создание способа разбить файл импорта на маленькие 100-строчные чанки, а затем обрабатывать каждый чанк как отдельный файл (для каждого чанка мне нужно было бы перезагрузить все мои поисковые данныеи ошибки предыдущих блоков, так что все они в одном контексте)
- Создание хранимых процедур для облегчения вставок вместо них (во-первых, это противоречит принципу использования EF, но я будусделайте это, если нет другого пути)
Большое спасибо заранее за ваши идеи.-Брайан