У меня есть веб-приложение с высоким трафиком c с миллионами записей в таблицах базы данных.
Никто (в основном, не база данных) не заботится о миллионах записей, если вы не забыли поставить на нем индексы. Гораздо интереснее то, насколько сложны запросы. Большинство запросов - особенно те, которые могут использовать индекс, по крайней мере, для уменьшения анализируемых чисел, - тривиальная нагрузка для миллиардов записей, но объединение более 15 таблиц, которое заставляет 100 ГБ данных в tempdb, является проблемой.
Я достаточно знаю об EF и о том, как правильно использовать его наиболее оптимальным образом.
Я сомневаюсь в этом, особенно для EfCore, который, кажется, меняется каждые выходные. Но ладно, вы избегаете самых глупых вещей, таких как один dbcontext для всего приложения.
Я знаю, что EF даже при использовании лучших практик имеет некоторые недостатки в производительности по сравнению с Dapper или ADO.
Это совершенно не так. Дело в том, что EF делает многое, чего напрямую не делают ни Dapper, ни ADO, и за это приходится платить. Это похоже на «Феррари быстрее грузовика, но есть недостатки». Грузовик медленный, за исключением случаев, когда вы перевозите много вещей. Т.е. запросы связаны с большими накладными расходами - но если вы не заботитесь о том, чтобы когда-либо обновлять запрашиваемые данные (обычно в веб-приложениях), отключите отслеживание изменений для этого запроса. Получение объектов связано с накладными расходами - хорошо, бывает. Но вы можете фильтровать, какие свойства вы материализуете. Сделайте это, и объем данных уменьшится. EF не совсем быстрый, но и не ужасный. Dapper и ADO (. NET) превзошли его, но у них меньше. Фактически, EF построен поверх ADO. NET, потому что, если вы не планируете писать весь сетевой стек самостоятельно, ADO. NET - единственный способ взаимодействовать с большинством баз данных.
Целое проблема: как вы думаете, что такое высокий трафик c? Я видел, как EF успешно развертывается в приложениях с десятками тысяч параллельных пользователей. Затем я сделал некоторые критически важные функции в 100 раз быстрее, потому что профессиональные программисты знали о Ef все, но никто не научил их, как правильно размещать индексы в таблицах.
Ef отлично работает с большими приложениями, но в зависимости от вам, возможно, придется масштабировать до некоторых серверов, если вы не пишете очень эффективный код на уровне пользователя и не избегаете ненужных вещей, таких как перечисление всех значений и затем фильтрация в памяти (и да, я видел это - особенно с людьми, "мы делаем репозитории вокруг Ef" тогда подумал, что возвращение IEnumerable - хорошая идея).