Entity Framework VS LINQ to SQL VS ADO.NET с хранимыми процедурами? [закрыто]

Вы можете переопределить функцию, используя трюк LD_PRELOAD - см. man ld.so. Вы компилируете shared lib с помощью своей функции и запускаете двоичный файл (вам даже не нужно изменять двоичный файл!), Например LD_PRELOAD=mylib.so myprog.

В теле вашей функции (в общей папке) вы пишете как this:

const char *getObjectName (object *anObject) {
  static char * (*func)();

  if(!func)
    func = (char *(*)()) dlsym(RTLD_NEXT, "getObjectName");
  printf("Overridden!\n");     
  return(func(anObject));    // call original function
}

Вы можете переопределить любую функцию из общей библиотеки, даже из stdlib, без изменения / перекомпиляции программы, чтобы вы могли сделать трюк в программах, для которых у вас нет источника. Разве это не приятно?

423
задан BritishDeveloper 23 April 2010 в 13:48
поделиться

4 ответа

Во-первых, если вы начинаете новый проект, используйте Entity Framework («EF») - теперь он генерирует гораздо лучший SQL (больше похожий на Linq to SQL), его легче поддерживать, и он более мощный, чем Linq to SQL ("L2S"). На момент выпуска .NET 4.0 я считаю Linq to SQL устаревшей технологией. MS открыто заявляла о том, что не будет продолжать разработку L2S.

1) Производительность

На этот вопрос сложно ответить. Для большинства операций с одним объектом ( CRUD ) вы найдете примерно эквивалентную производительность со всеми тремя технологиями. Вы должны знать, как работают EF и Linq to SQL, чтобы использовать их в полной мере. Для операций большого объема, таких как опросные запросы, вы можете захотеть, чтобы EF / L2S «скомпилировал» ваш запрос сущности, чтобы инфраструктуре не приходилось постоянно регенерировать SQL, или вы можете столкнуться с проблемами масштабируемости. (см. правки)

Для массовых обновлений, когда вы обновляете большие объемы данных, необработанный SQL или хранимая процедура всегда будет работать лучше, чем решение ORM, потому что вам не нужно маршалировать данные по сети в ORM для выполнения обновлений.

2) Скорость разработки

В большинстве сценариев EF вытесняет «голые» SQL / хранимые процессы, когда дело касается скорости разработки.Конструктор EF может обновлять вашу модель из вашей базы данных по мере ее изменения (по запросу), поэтому вы не столкнетесь с проблемами синхронизации между вашим объектным кодом и кодом базы данных. Единственный случай, когда я бы не стал рассматривать использование ORM, - это когда вы делаете приложение типа отчетов / панели мониторинга, в котором вы не выполняете никаких обновлений, или когда вы создаете приложение только для выполнения операций по обслуживанию необработанных данных в базе данных.

3) Аккуратный / поддерживаемый код

Безусловно, EF превосходит SQL / sprocs. Поскольку ваши отношения моделируются, соединения в вашем коде относительно нечасты. Взаимосвязь сущностей почти очевидна для читателя по большинству запросов. Нет ничего хуже, чем переходить от уровня к уровню отладки или через несколько уровней SQL / среднего уровня, чтобы понять, что на самом деле происходит с вашими данными. EF очень эффективно вносит вашу модель данных в ваш код.

4) Гибкость

Сохраненные процедуры и необработанный SQL более «гибкие». Вы можете использовать sprocs и SQL для создания более быстрых запросов для нечетных конкретных случаев, и вы можете использовать собственные функции БД проще, чем с ORM.

5) В целом

Не попадайтесь в ловушку ложной дихотомии выбора ORM и использования хранимых процедур. Вы можете использовать и то, и другое в одном приложении, и, вероятно, вам следует это сделать. Большие массовые операции должны выполняться в хранимых процедурах или SQL (которые фактически могут вызываться EF), а EF следует использовать для ваших операций CRUD и большинства потребностей вашего среднего уровня. Возможно, вы захотите использовать SQL для написания отчетов.Думаю, мораль этой истории такая же, как и всегда. Используйте подходящий инструмент для работы. Но, что самое худое, EF в настоящее время очень хорош (начиная с .NET 4.0). Потратьте немного времени на чтение и глубокое понимание этого, и вы с легкостью сможете создавать потрясающие высокопроизводительные приложения.

РЕДАКТИРОВАТЬ : EF 5 немного упрощает эту часть с помощью автоматически скомпилированных запросов LINQ , но для действительно больших объемов данных вам обязательно нужно протестировать и проанализировать, что лучше всего подходит для вас. реальный мир.

427
ответ дан 22 November 2019 в 23:20
поделиться

ваш вопрос в основном состоит в том, чтобы O / RM или SQL вручную писали

Использование ORM или простого SQL?

Взгляните на некоторые другие решения O / RM, L2S не единственное (NHibernate, ActiveRecord)

http://en.wikipedia.org/wiki/List_of_object-relational_mapping_software

для ответа на конкретные вопросы:

  1. Зависит от качества решения O / RM, L2S довольно хорошо генерирует SQL
  2. Обычно это намного быстрее при использовании O / RM, когда вы проверяете процесс
  3. Код также обычно более аккуратный и удобный в обслуживании
  4. . Прямой SQL, конечно, даст вам больше гибкости, но большинство O / RM могут выполнять все, кроме самых сложных запросов.
  5. В целом я бы посоветовал использовать O / RM, потеря гибкости незначительно
18
ответ дан 22 November 2019 в 23:20
поделиться

Хранимые процедуры:

(+)

  • Большая гибкость
  • Полный контроль над SQL
  • Высочайшая доступная производительность

(-)

  • Требуется знание SQL
  • Хранимые процедуры находятся вне системы управления версиями
  • Существенное количество «повторений» при указании тех же имен таблиц и полей. Высокий шанс сломать приложение после переименования объекта БД и пропуска каких-либо ссылок на него где-то.
  • Медленная разработка

ORM:

(+)

  • Быстрая разработка
  • Код доступа к данным теперь под контролем источника
  • Вы изолированы от изменений в БД. Если это произойдет, вам нужно только обновить вашу модель / сопоставления в одном месте.

(-)

  • Производительность может быть хуже
  • Отсутствие или слабое управление SQL, производимым ORM (может быть неэффективным или, что еще хуже, содержит ошибки). Возможно, потребуется вмешаться и заменить его настраиваемыми хранимыми процедурами. Это сделает ваш код беспорядочным (некоторый LINQ в коде, некоторый SQL в коде и / или в БД вне контроля версий).
  • Поскольку любая абстракция может производить "высокоуровневых" разработчиков, не имеющих представления о том, как она работает под капотом

Общий компромисс заключается между большой гибкостью и потерей большого количества времени по сравнению с ограничениями в том, что вы можете делать, но сделать это очень быстро.

На этот вопрос нет общего ответа. Это вопрос священных войн. Также зависит от проекта и ваших потребностей. Выберите то, что лучше всего подходит для вас.

91
ответ дан 22 November 2019 в 23:20
поделиться

LINQ-to-SQL - замечательная технология, которая очень проста в использовании и в целом генерирует очень хорошие запросы к серверной части. Планировалось, что LINQ-to-EF вытеснит его, но исторически было крайне неудобно использовать и генерировал гораздо худший SQL. Я не знаю текущего положения дел, но Microsoft пообещала перенести все достоинства L2S в L2EF, так что, может быть, сейчас все лучше.

Лично мне очень не нравятся инструменты ORM (подробности см. В моей диатрибе здесь ), поэтому я не вижу причин отдавать предпочтение L2EF, поскольку L2S дает мне все, что я когда-либо ожидал от уровень доступа к данным. Фактически, я даже думаю, что функции L2S, такие как созданные вручную сопоставления и моделирование наследования, добавляют совершенно ненужную сложность. Но это только я. ; -)

13
ответ дан 22 November 2019 в 23:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: