.Net EF вставляет строки данных долго после закрытия приложения - PullRequest
0 голосов
/ 14 марта 2012

Почему EF (4.0) занимает так много времени для вставки строк в таблицу? Когда я запрашивал данные сразу после закрытия приложения, он возвращал около 20 000 строк, и позже я заметил, что, хотя приложение было закрыто, данные не были вставлены, а вставки происходили в фоновом режиме. Почему это? Как можно сообщить приложению (я планирую запустить эти вставки как службу Windows, так как они долго работают), что вставки действительно завершены? Каковы способы увеличения скорости этих вставок? У меня только одно отношение внешнего ключа ... так что это не очень сложная модель данных. Спасибо за любую помощь!

Приложение является приложением ASP.Net. Вот фрагмент кода, где я звоню SaveChanges().

do
{
    if (token != null)
    {
        response = context.Execute<NetflixService.Title>(token)
                       as QueryOperationResponse<NetflixService.Title>;
    }

    using (Models.MovieContext  movieCtxt = new Models.MovieContext())
    {
        foreach (var item in response)
        {
            IList<Models.MovieGenre> genres = new List<Models.MovieGenre>();
            foreach (var genreIterator in item.Genres)
            {
                var genre = new Models.MovieGenre
                {
                    Genre = genreIterator.Name
                };
                genres.Add(genre);
            }

            //genres.Add(new Models.MovieGenre { Genre = "filmy" });
            var movie = new Models.MovieCatalog
            {
                MovieTitle = item.Name,
                MovieGenres = genres
            };

            movieCtxt.MovieCatalogs.Add(movie);
        }

        movieCtxt.SaveChanges();
    }

}
while ((token = response.GetContinuation()) != null);

1 Ответ

1 голос
/ 15 марта 2012

Я предполагаю, что вы на самом деле используете EF> = 4.1 (DbContext), а не EF 4.0, как вы сказали (потому что ObjectSet<T> не имеет метода Add, но вы используете movieCtxt.MovieCatalogs.Add(movie). В EF4.0, вы бы использовали AddObject.)

. В этом случае отключите автоматическое обнаружение изменений, чтобы улучшить производительность массовых вставок:

using (Models.MovieContext movieCtxt = new Models.MovieContext())
{
    movieCtxt.Configuration.AutoDetectChangesEnabled = false;

    //...
}

Подробнее здесь:

Как уже сказано в комментарии, необходимо убить веб-сервер, чтобы действительно остановить ваше приложение.Закрытие браузера или остановка отладки в Visual Studio не приводит к завершению работы приложения.

Вставка данных в базу данных завершена, когда возвращается SaveChanges().SaveChanges не пакетирует все операторы INSERT, он фактически отправляет их по одному в базу данных и завершает работу, когда отправляется последний оператор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...