Entity Framework против LINQ to SQL

Теперь, когда был выпущен .NET v3.5 SP1 (вместе с VS2008 SP1), у нас теперь есть доступ к инфраструктуре сущностей .NET.

У меня вопрос такой. При попытке выбора между использованием Entity Framework и LINQ to SQL в качестве ORM, в чем разница?

Как я понимаю, Entity Framework (при использовании с LINQ to Entities) является «старшим братом». LINQ to SQL? Если это так, то какие преимущества он имеет? Что он может сделать, что LINQ to SQL не может сделать самостоятельно?

807
задан 15.05.2020, 13:09

8 ответов

LINQ к SQL только поддерживает от 1 до 1 отображения таблиц базы данных, представлений, sprocs и функций, доступных в Microsoft SQL Server. Это - большой API для использования для быстрой конструкции доступа к данным для относительно хорошо разработанных баз данных SQL Server. LINQ2SQL был сначала выпущен с C# 3.0 и.Net Платформой 3.5.

LINQ к Объектам (Платформа Объекта ADO.NET) является ORM (Объектный Реляционный Картопостроитель) API, который допускает широкое определение объектных моделей предметной области и их отношений ко многим различным поставщикам данных ADO.NET. По сути, Вы можете смешивание и подгонка много различных поставщиков базы данных, серверов приложений или протоколов для разработки агрегированного мэшапа объектов, которые создаются из множества таблиц, источников, сервисов, и т.д. Платформа ADO.NET была выпущена с.Net Платформой 3,5 SP1.

Это - хорошая вводная статья о MSDN: Представление LINQ к Реляционным Данным

471
ответ дан 15.05.2020, 13:10
  • 1
    @CoffeeAddict, в то время как они очень похожи в стиле с помощью лямбд LINQ, каждый API, имеет совершенно другие основы. Например, способ, которым LINQ2SQL генерирует SQL-запросы, допускает использование функций SQL, тогда как L2E не делает, или по крайней мере не сделал по состоянию на 2008. – Kris 15.05.2020, 13:11
  • 2
    похож на Вас, используют LINQ для SQL для запросов в EF – PositiveGuy 15.05.2020, 13:11

Мой опыт с Платформой Объекта был менее, чем звездным. Во-первых, необходимо наследоваться базовым классам EF, поэтому сказать до свидания POCOs. Ваш дизайн должен будет быть вокруг EF. С LinqtoSQL я мог использовать свои существующие бизнес-объекты. Кроме того, нет никакой ленивой загрузки, необходимо реализовать это сами. Существует некоторая работа arounds там для использования POCOs и ленивой загрузки, но они существуют, по моему скромному мнению, потому что EF еще не готов. Я планирую возвратиться к нему после 4.0

51
ответ дан 15.05.2020, 13:10
  • 1
    Я думаю для тестирования, что это могло иметь значение. – Mark Peters 12.10.2019, 05:57
  • 2
    ПОСТЕПЕННО поддержка доступна в эти дни, и наследование больше не является требованием для классов объекта @CoffeeAddict, ПОСТЕПЕННО просто простой объект без уверенности в определенной платформе и большая часть современных шаблонов платформы объекта – Chris McGrath 15.05.2020, 13:11
  • 3
    Отсутствие ПОСТЕПЕННО поддержки является причиной номер один, что я предпочитал LINQ to SQL Платформе Объекта. Я могу пересмотреть EF, когда они включают его в следующую версию, поскольку они обещают. Существуют некоторые дополнительные проекты там, которые делают POCOs для EF, но не чисто достаточно. – Joseph Ferris 15.05.2020, 13:11
  • 4
    В случае, если кто-то (как я) doesn' t знают то, что ПОСТЕПЕННО обозначает: Простой Объект CLR – CBono 15.05.2020, 13:12
  • 5
    Я слышу, ПОСТЕПЕННО возможно в EF 4 – PositiveGuy 15.05.2020, 13:12
  • 6
    Я действительно don' t видят то, что большая суета не поддерживающий POCOs... it' s еще один уровень парней абстракции. Создайте фабрику, введя репозиторий данных и создайте свой POCOs там. It' s, вероятно, хорошая идея так или иначе. – Stimul8d 15.05.2020, 13:12

Существует много очевидных различий, обрисованных в общих чертах в той статье @lars, отправленный, но короткий ответ:

  • L2S сильно связывается - свойство объекта к определенному полю базы данных или более правильно объектного отображения на определенную схему базы данных
  • L2S будет только работать с SQL Server (насколько я знаю)
  • , EF позволяет отображать единый класс на несколько таблиц
  • , EF обработает отношения M-M
  • , EF будет иметь способность предназначаться для любого поставщика данных ADO.NET

, исходная предпосылка была L2S, для Быстрой разработки и EF для большего количества "enterprisey" n-tier приложения, но это продает L2S, немного короткий.

92
ответ дан 15.05.2020, 13:11
  • 1
    Извините, запущенный мой комментарий перед добавлением Вашего. В тестировании существует потенциальное использование, но я хотел предостеречь на всякий случай, что это было для производственного кода. Современная обработка исключений не оптимизирует ни для какого случая исключения, таким образом, при обстоятельствах успеха you' ll подвергнуться наверху, которого избегает Ваш случай возникновения отказов. Извращенный, по меньшей мере. – ShadowRanger 12.10.2019, 05:57
  • 2
    Ваша кавычка " L2S будет только работать с SQL Server (насколько я знаю), " обновление потребностей: проект с открытым исходным кодом " dblinq" заменяет LINQ к блоку SQL с тем, который может говорить с MySQL, PostgreSQL, Ingres, Firebird, SQLite... и Microsoft SQL (конечно). – Contango 15.05.2020, 13:11
  • 3
    ожидайте... так EF doesn' t создают, сильно связал объекты DL? – PositiveGuy 15.05.2020, 13:12
  • 4
    да исходная предпосылка, что L2S не является предприятием способное решение, больше не верна. Я подразумеваю, что StackOverflow работает на L2S и наборе другого .coms, такого как Redbox, и многое другое. – PositiveGuy 15.05.2020, 13:12

Если Ваша база данных будет проста и проста, LINQ к SQL сделает. При необходимости в логических/абстрактных объектах сверху таблиц то пойдите для Платформы Объекта.

12
ответ дан 15.05.2020, 13:11
  • 1
    @Pete Kirkham: isAssignableFrom посещает Урок в качестве параметра, и по существу делает то же самое, как isInstance делает на объекте. isInstance возвращает true, если аргумент совместим с присвоением с классом, таким образом, это работает над подклассами одинаково хорошо. – Mark Peters 12.10.2019, 05:58
  • 2
    Платформа объекта допускает слой абстракции вершины базы данных. Проблема со многими ИЛИ Картопостроителями сегодня (по-моему), состоит в том, что они обеспечивают от 1 до 1 отображения между таблицами и классами. Модель базы данных doesn' t всегда отражают способ, которым мы думаем об этом с точки зрения бизнес-модели. – senfo 15.05.2020, 13:12
  • 3
    Исчерпал пространство. Во всяком случае, на основе того, что я сказал выше, I' d утверждают что Ваш ответ isn' t завершенный. – senfo 15.05.2020, 13:12
  • 4
    Я думаю, что это - действительно плохой совет. L2S хорош невнимательный из простоты или сложность Вашей базы данных. Реальное прерывание не имеет надлежащего разделения проблем. При попытке объединить свой бизнес-слой, и Ваш уровень доступа к данным, и использовать Ваш Linqed возражает для всего, то you' ll находят ограничение L2S. Но that' s проблема с чрезмерно упрощенным и монолитным дизайном. L2S делает большой DAL, и если Вы рассматриваете запросы и персистентность отдельное беспокойство из Ваших бизнес-правил, you' ll сохраняют себя большая проблема в большом количестве областей в конечном счете. – mattmc3 15.05.2020, 13:13
  • 5
    и что делает Вы имеете в виду как пример для потребности " logical/abstracted". да я знаю то, что абстракция является всего лишь примером в Вашем контексте..., чтобы объяснить мне точно что you' ре, говорящее..., описывает его, don' t просто дают мне общий сленг... that' s все относительно динамика, говорящего те слова, таким образом, у меня нет подсказки, что ВЫ подразумеваете под этим. – PositiveGuy 15.05.2020, 13:13
  • 6
    это ничего не говорит мне. Что просто в Ваших терминах? – PositiveGuy 15.05.2020, 13:13

Я думаю, что быстрый и грязный ответ - то, что

  • LINQ к SQL является quick-easy, чтобы сделать это. Это означает, что Вы начнете более быстрые, и поставите более быстрый, если Вы будете работать над чем-то меньшим.
  • Платформа Объекта является всеобщим, беспощадным способом сделать это. Это означает, что Вы займете больше времени заранее, разработаете медленнее и иметь больше гибкости, если Вы будете работать над чем-то большим.
195
ответ дан 15.05.2020, 13:12
  • 1
    Brad, что Вы предложили бы для сайта электронной коммерции? Я имею в виду меня can' t видят, что что-либо кроме простого ПРЕВРАЩАЕТ В ТВОРОГ продолжение там... – PositiveGuy 15.05.2020, 13:13
  • 2
    You' ll также имеют тенденцию писать меньше строк кода с L2S для выполнения того же самого, как Вы были бы с EF. Никакая ленивая загрузка в EF не означает you' ре, всегда проверяющее, было ли что-то загружено или нет. – Paul Mendoza 15.05.2020, 13:13
  • 3
    @CoffeeAddict, очевидно, говорится в лучших 3 из наиболее проголосовавшего ответа L2S для простого CRUD – IsmailS 15.05.2020, 13:13
  • 4
    @Banford С EF в.NET 4.0 я думаю, что это лучше, чем L2S. Опции, которые отсутствовали в EF в 3,5, что L2S имел, были добавлены к EF в.NET 4.0. Ваши операторы LINQ теперь в EF в.NET 4.0 собираются посмотреть в значительной степени то же как те в L2S. EF получает Вас некоторые дополнительные вещи, которые можно сделать теперь сверху того, что предлагает L2S. – Paul Mendoza 15.05.2020, 13:13
  • 5
    Этому ответу теперь 5 лет и довольно устаревший. Платформа объекта 6 теперь в бета-версии и очень улучшена, включает Ленивую загрузку, перечислимую поддержку, и т.д., и т.д. – Tim 15.05.2020, 13:14

Я думаю, необходимо ли разработать что-то быстрое без Странных вещей в середине, и Вам нужно средство, чтобы иметь объекты, представляющие Ваши таблицы:

Linq2Sql может быть объединенной пользой, использование его с LinQ развязывает большую синхронизацию разработки.

7
ответ дан 15.05.2020, 13:13
  • 1
    @Justin - Спасибо. Я находился рядом с выполнением этого и также обобщением функции для взятия произвольного числа аргументов. Если Вы (или кто-либо еще) видите лучший способ для меня щипнуть названия переданных аргументов из вызова функции, сообщите мне. That' s, что я придумал на лету... – Josh O'Brien 24.12.2019, 22:43
  • 2
    " никакие Странные вещи в middle" хорошо что ВЫ подразумеваете под этим. Пример " странная вещь в middle" – PositiveGuy 15.05.2020, 13:13

Мое впечатление - то, что Ваша база данных довольно огромна или очень плохо разработанная, если Linq2Sql не соответствует Вашим потребностям. У меня есть приблизительно 10 веб-сайтов, и больше и меньших все использование Linq2Sql. Я смотрел и платформа Объекта много раз, но я не могу найти серьезное основание для использования ее по Linq2Sql. Это сказало, что я пытаюсь использовать свои базы данных в качестве модели, таким образом, у меня уже есть от 1 до 1 отображения между моделью и базой данных.

В моем текущем задании у нас есть база данных с 200 + таблицы. Старая база данных с большим количеством плохих решений, таким образом, там я видел преимущество Платформы Объекта по Linq2Sql, но тем не менее я предпочту перепроектировать базу данных начиная с базы данных, является механизмом приложения и если база данных будет плохо разработана и медленная тогда, то мое приложение также будет медленным. Используя платформу Объекта на такой базе данных походит на quickfix для маскировки плохой модели, но это никогда не могло маскировать плохую производительность, которую Вы получаете от такой базы данных.

36
ответ дан 15.05.2020, 13:14
  • 1
    Ваши пропавшие без вести точки - даже с маленькими базами данных, можно хотеть что-то другое, чем 1:1 отношения между таблицами базы данных и кодом/объектами области. Просто зависит от того, сколько абстракции Вы хотите в шине/объектах области. – alchemical 15.05.2020, 13:14
  • 2
    Я понял что:) Сегодня мне нравятся к handcode мои предприятия. Я все еще использую Linq2sql, но только в моих репозиториях, где я получаю данные с помощью Linq2sql и преобразования linq2sql объекты в мои пользовательские предприятия. Возможно, немного больше работы, чем использование или-картопостроителя, но тем не менее мне нравится сохранять мой бизнес-слой свободным от любого ИЛИ-КАРТОПОСТРОИТЕЛЯ определенный код. – terjetyl 15.05.2020, 13:15

LINQ к Действительно Мертвому SQL? Jonathan Allen для InfoQ.com

Matt Warren описывает [LINQ к SQL] как что-то, что ", как даже не предполагалось, существовало". По существу это, как просто предполагалось, было заместителем, чтобы помочь им разработать LINQ, пока реальный ORM не был готов.

...

масштаб Платформы Объекта заставил его пропускать.NET 3.5/Visual Studio крайних срока 2008 года. Это было завершено как раз к, к сожалению, именованной ".NET 3.5 Пакета обновления 1", который больше был похож на главную версию, чем пакет обновления.

...

Разработчикам не нравится [Платформа Объекта ADO.NET] из-за сложности.

...

с.NET 4.0, LINQ к Объектам будет рекомендуемым решением для доступа к данным для LINQ к реляционным сценариям.

107
ответ дан 15.05.2020, 13:14
  • 1
    Я действительно использую ИДЕЮ, но хочу извлечь общий код во что-то, что выражает намерение приятно – Alex Baranosky 12.10.2019, 05:56
  • 2
    На самом деле, мы don' t как EF, потому что это имеет такого бедного разработчика и так чрезвычайно, чрезвычайно багги. I' ve никогда не находил, что он был всем тем комплексом. – BlueRaja - Danny Pflughoeft 15.05.2020, 13:15
  • 3
    МНОГО крупнейших сайтов электронной коммерции использует LINQ для SQL. Примеры: Redbox, Stackoverflow, и т.д. – PositiveGuy 15.05.2020, 13:15
  • 4
    Я знаю МНОГО хороших разработчиков, которые используют LINQ для SQL и говорят, что эти статьи полностью раздуты. Я соглашаюсь. LINQ к SQL использовался в мощном .coms и все еще. – PositiveGuy 15.05.2020, 13:16
  • 5
    Да, вызов.ToString () на целочисленном свойстве в L2EF запрашивает shouldn' t вызывают исключение. – StingyJack 15.05.2020, 13:16

Теги

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