Entity Framework против LINQ to SQL

828

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

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

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

Крис Робертс
источник
138
Я думаю, что ответы ниже должны быть пересмотрены, потому что с тех пор, как EF был выпущен, новые разработчики, которые пришли сюда, могут получить неправильное впечатление. EF стал ВЕЛИКОЛЕПНЫМ и легким инструментом с момента его раннего выпуска. Вы просто устанавливаете соединение с БД, и это примерно 90% всего, что вам нужно. Очень быстрое развитие, с опытной точки зрения! Оттуда - LINQ ваш лучший друг. Он легко настраивается, MVC просто в восторге, и людям, которые говорят, что это плохо, - сначала узнайте, как его использовать (а также получите LINQ)!
Грауманоз
10
Просто так понятно - у вас сейчас нет выбора - MSFT эффективно убил LINQ2SQL в пользу EF. Однако тот факт, что MSF с открытым исходным кодом EF помог ему сосать меньше и определенно становится лучше. Но для любого, кто входит в EF - обязательно поймите, что в EF все еще есть много причуд. Я написал об одном - stackoverflow.com/questions/305092/…
nikib3ro
4
@ kape123, (а) LINQ to SQL не является «мертвым»; это все еще годно к употреблению; (b) LINQ to SQL - это стандартный метод доступа к данным в разработке для Windows Phone 8.
Райан Ланди
9
@ user3308043, [необходима цитата].
Райан Ланди
3
@Kyralessa - С 2010 года (с выпуском .NET4.0, самой последней цитаты, которую я смог найти), MS признала, что , хотя некоторые инвестиции могут быть сделаны в LINQ2SQL, «основная часть наших общих инвестиций будет в Entity Фреймворк."
kmote

Ответы:

483

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

LINQ to Entities (ADO.Net Entity Framework) - это API-интерфейс ORM (Object Relational Mapper), который позволяет широко определять модели предметной области и их отношения со многими различными поставщиками данных ADO.Net. Таким образом, вы можете смешивать и сопоставлять несколько различных поставщиков баз данных, серверов приложений или протоколов для разработки агрегированной совокупности объектов, которые составлены из множества таблиц, источников, служб и т. Д. ADO.Net Framework была выпущена с .Net Framework 3.5 SP1.

Это хорошая вводная статья о MSDN: введение в LINQ для реляционных данных

Kris
источник
похоже, что вы используете LINQ to SQL для запроса в EF
PositiveGuy
11
@CoffeeAddict, хотя они очень похожи по стилю, используя лямбды LINQ, каждый API имеет совершенно разные основы. Например, способ, которым LINQ2SQL генерирует SQL-запросы, позволяет использовать функции SQL, тогда как L2E не использует их, или, по крайней мере, не делал это с 2008 года.
Kris
2
Объектно-ориентированный подход EF делает его действительно простым и удобным в использовании, очень быстро кодируется, управляется. Для меня просто лучший способ доступа к данным.
Антуан Пеллетье
10
Этот ответ устарел. Теперь Linq to SQL поддерживает отображение one2many
Джордж Ланец
201

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

  • LINQ to SQL - это простой и быстрый способ сделать это. Это означает, что вы будете работать быстрее и быстрее, если работаете над чем-то меньшим.
  • Entity Framework - это универсальный, не имеющий запретов способ сделать это. Это означает, что вы потратите больше времени на авансирование, будете медленнее развиваться и будете более гибкими, если будете работать над чем-то большим.
Брэд Туттероу
источник
32
Вы также будете стремиться писать меньше строк кода в L2S, чтобы выполнить то же самое, что и в EF. Отсутствие отложенной загрузки в EF означает, что вы всегда проверяете, загружено что-то или нет.
Пол Мендоса
Брэд, что бы ты предложил для сайта электронной коммерции? Я имею в виду, что я не вижу ничего, кроме простых CRUDs, происходящих там ...
PositiveGuy
2
@CoffeeAddict, очевидно, в тройке самых популярных ответов говорится, что L2S для простого CRUD
IsmailS
11
@Banford С EF в .NET 4.0 я думаю, что это лучше, чем L2S. Функции, отсутствующие в EF в 3.5, которые были добавлены в EF в .NET 4.0, были добавлены в L2S. Ваши операторы LINQ теперь в EF в .NET 4.0 будут выглядеть почти так же, как в L2S. EF предлагает вам несколько дополнительных вещей, которые вы можете сделать сейчас, помимо того, что предлагает L2S.
Пол Мендоса
40
Этому ответу уже 5 лет, и он устарел. Entity Framework 6 теперь в бета-версии и значительно улучшен, включает в себя отложенную загрузку, поддержку перечислений и т. Д. И т. Д.
Тим
109

LINQ to SQL действительно мертв? Джонатан Аллен для InfoQ.com

Мэтт Уоррен описывает [LINQ to SQL] как нечто, что «даже не должно было существовать». По сути, он просто должен был помочь им в разработке LINQ до тех пор, пока не будет готов настоящий ORM.

...

Масштаб Entity Framework заставил его пропустить крайний срок .NET 3.5 / Visual Studio 2008. Он был завершен вовремя, к сожалению, под названием «.NET 3.5 Service Pack 1», который больше походил на основной выпуск, чем на пакет обновления.

...

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

...

Начиная с .NET 4.0, LINQ to Entities будет рекомендованным решением для доступа к данным для LINQ для реляционных сценариев.

Зак Петерсон
источник
56
На самом деле, нам не нравится EF, потому что у него такой плохой дизайнер и он очень, очень глючный. Я никогда не находил это настолько сложным.
BlueRaja - Дэнни Пфлугхофт
12
Множество крупных сайтов электронной коммерции используют LINQ to SQL. Примеры: Redbox, Stackoverflow и т. Д.
PositiveGuy
14
Я знаю много хороших разработчиков, которые используют LINQ to SQL и говорят, что эти статьи полностью раздуты. Согласен. LINQ to SQL использовался в мощных .coms и до сих пор.
PositiveGuy
4
Да, вызов .ToString () для целочисленного свойства в запросе L2EF не должен вызывать исключение.
StingyJack
3
@ BlueRaja-DannyPflughoeft Это правда после 5 лет?
Викас Рана
94

В этой статье @lars опубликовано несколько очевидных отличий, но короткий ответ:

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

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

JamesSugrue
источник
13
Ваша цитата «L2S будет работать только с SQL Server (насколько мне известно)» нуждается в обновлении: проект с открытым исходным кодом «dblinq» заменяет сборку LINQ to SQL тем, который может взаимодействовать с MySQL, PostgreSQL, Ingres, Firebird, SQLite. .. и Microsoft SQL (конечно).
Контанго
1
подождите ... чтобы EF не создавал тесно связанные объекты DL?
PositiveGuy
7
да, первоначальная предпосылка о том, что L2S не является решением для предприятий, больше не соответствует действительности. Я имею в виду, что StackOverflow работает на L2S и нескольких других .com, таких как Redbox, и многих других.
PositiveGuy
74

LINQ to SQL

  1. Однородный источник данных: SQL Server
  2. Рекомендуется только для небольших проектов, где структура данных хорошо разработана
  3. Сопоставление можно изменить без перекомпиляции с помощью SqlMetal.exe.
  4. .dbml (язык разметки базы данных)
  5. Соотношение один к одному между таблицами и классами
  6. Поддерживает наследование TPH
  7. Не поддерживает сложные типы
  8. Подход к хранилищу
  9. База данных-ориентированный вид базы данных
  10. Создано командой C #
  11. Поддерживается, но дальнейшие улучшения не предусмотрены

Entity Framework

  1. Источник данных Heterogeneus: поддержка многих поставщиков данных
  2. Рекомендуется для всех новых проектов, кроме:
    • маленькие (LINQ to SQL)
    • когда источником данных является плоский файл (ADO.NET)
  3. Сопоставление может быть изменено без перекомпиляции при настройке файлов модели и сопоставления. Процесс артефакта метаданных для копирования в каталог вывода
  4. .edmx (Entity Data Model), которая содержит:
    • SSDL (язык определения схемы хранения)
    • CSDL (язык определения концептуальной схемы)
    • MSL (язык спецификации картографирования)
  5. Отображения один-к-одному, один-ко-многим, многие-к-одному между таблицами и классами
  6. Поддерживает наследование:
    • TPH (таблица на иерархию)
    • TPT (таблица по типу)
    • TPC (таблица на конкретный класс)
  7. Поддерживает сложные типы
  8. Подходы «сначала код», «сначала модель», «сначала хранилище»
  9. Ориентированное на приложение представление базы данных
  10. Создано командой SQL Server
  11. Будущее API данных Microsoft

Смотрите также:

Рышард Деган
источник
6
Это самый актуальный и подробный ответ.
ErTR
2
Разве Entity Framework не использует LINQ to SQL, когда, скажем, вы пишете dbSet<Orders>.Where()...ToList()? Я думаю, что вводить Entity Framework в противоположность LINQ to SQL вводит в заблуждение.
Дон Чидл
4
@mmcrae EF не использует L2S, оба являются linq-провайдерами для базовых баз данных. Если вы интерпретируете его как Linq-to-a-database, похожий на linq-to-objects и linq-to-xml, то да, оба они похожи в linq-to-a-database. Но нет, EF не использует L2S (или наоборот). Два полностью разделенных инструмента.
Мартен
4
«Рекомендуется для всех новых проектов, кроме ... маленьких», я не согласен. Code First - это чрезвычайно быстрый способ начать работу с небольшими проектами. Кроме этого, большое обновление к этому вопросу.
DrewJordan
51

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

Jiyosub
источник
7
Отсутствие поддержки POCO - это причина номер один, по которой я выбираю LINQ to SQL, а не Entity Framework. Я могу вернуться к EF, когда они включат его в следующую версию, как они обещают. Есть некоторые дополнительные проекты, которые делают POCO для EF, но не достаточно чисто.
Джозеф Феррис
27
В случае, если кто-то (как я) не знает, что означает POCO: Plain Old CLR Object
CBono
4
Я действительно не понимаю, в чем суета по поводу не поддержки POCO ... это еще один уровень абстракции, ребята. Создайте фабрику, добавьте хранилище данных и создайте там свои POCO. В любом случае, это хорошая идея.
EightyOne Unite
3
Я слышал, что POCO возможно в EF 4
PositiveGuy
8
Поддержка POCO доступна в наши дни, и наследование больше не является обязательным требованием для классов сущностей @CoffeeAddict POCO - это просто простой объект, не зависящий от конкретной структуры и являющийся основной частью современных шаблонов структуры сущности
Крис МакГрат,
46

Я нашел очень хороший ответ здесь , который объясняет , когда использовать то , что в простых словах:

Основное правило, для которого следует использовать платформу, - как планировать редактирование данных на уровне презентации.

  • Linq-To-Sql - используйте эту платформу, если вы планируете редактировать взаимно-однозначное отношение ваших данных на уровне презентации. Это означает, что вы не планируете объединять данные из более чем одной таблицы в одном представлении или странице.

  • Entity Framework - используйте эту платформу, если вы планируете объединять данные из более чем одной таблицы в вашем представлении или странице. Чтобы сделать это более понятным, приведенные выше термины относятся к данным, которые будут обрабатываться в вашем представлении или на странице, а не просто отображаться. Это важно понимать.

С Entity Framework вы можете «объединить» данные таблицы вместе, чтобы представить их на уровне представления в редактируемой форме, а затем, когда эта форма будет отправлена, EF будет знать, как обновить ВСЕ данные из различных таблиц.

Вероятно, есть более точные причины выбирать EF вместо L2S, но это, вероятно, будет проще понять. L2S не имеет возможности объединять данные для представления презентации.

Наваз
источник
36

У меня сложилось впечатление, что ваша база данных довольно обширна или очень плохо спроектирована, если Linq2Sql не соответствует вашим потребностям. У меня есть около 10 веб-сайтов, больше и меньше, все используют Linq2Sql. Я смотрел и Entity Framework много раз, но я не могу найти вескую причину для его использования над Linq2Sql. Тем не менее, я пытаюсь использовать свои базы данных в качестве модели, поэтому у меня уже есть соотношение 1: 1 между моделью и базой данных.

На моей текущей работе у нас есть база данных с более чем 200 таблицами. Старая база данных с множеством плохих решений, поэтому я мог видеть преимущество Entity Framework по сравнению с Linq2Sql, но все же я бы предпочел изменить структуру базы данных, поскольку база данных является ядром приложения, а если база данных плохо спроектирована и работает медленно, тогда мое приложение также будет медленным. Использование Entity Framework в такой базе данных кажется быстрым исправлением, чтобы скрыть плохую модель, но она никогда не сможет скрыть плохую производительность, которую вы получаете от такой базы данных.

terjetyl
источник
1
Вы упускаете суть - даже с небольшими базами данных вам может потребоваться нечто иное, чем соотношение 1: 1 между таблицами базы данных и объектами кода / домена. Просто зависит от того, сколько абстракции вы хотите в объектах bus / domain.
алхимический
18
Я понял это :) Сегодня я люблю кодировать свои бизнес-сущности. Я по-прежнему использую Linq2sql, но только внутри своих репозиториев, где я получаю данные с помощью Linq2sql и преобразую сущности linq2sql в свои собственные бизнес-сущности. Может быть, немного больше работы, чем использование or-mapper, но все же я хотел бы, чтобы на моем бизнес-уровне не было кода, специфичного для OR-mapper.
terjetyl
25

Вы можете найти хорошее сравнение здесь:

введите описание изображения здесь

http://www.dotnet-tricks.com/Tutorial/entityframework/1M5W300314-Difference-between-LINQ-to-SQL-and-Entity-Framework.html

http://www.c-sharpcorner.com/blogs/entity-framework-vs-linq-to-sql1

Омер К
источник
2
Некоторые вещи в ответе не верны. EDMX не требуется, если вы используете Code First. И я не понимаю, как DI вступает в игру, когда вы используете Code First.
Мартен
1
Кроме того, Linq to SQL может просто заполнить БД из классов моделей. Не уверен, что он также может генерировать саму БД, но генерация схемы и таблиц относится к возможностям SQL в Linq.
Том Линт
Спасибо за ответ, я думаю, что можно использовать sqlmetal.exe docs.microsoft.com/en-us/dotnet/framework/tools/… для генерации кода / отображения из базы данных при использованииLinq to SQL
Vinod Srivastav
23

Здесь приведены ответы на многие из различий между Linq2Sql и EF, но есть ключевой момент, которому не было уделено много внимания: Linq2Sql поддерживает только SQL Server, тогда как EF имеет поставщиков для следующих RDBMS:

Предоставлено Microsoft:

  • Драйверы ADO.NET для SQL Server, OBDC и OLE DB

Через сторонних поставщиков:

  • MySQL
  • оракул
  • DB2
  • VistaDB
  • SQLite
  • PostgreSQL
  • Informix
  • U2
  • Sybase
  • Synergex
  • жар-птица
  • Npgsql

назвать несколько.

Это делает EF мощной программной абстракцией для вашего хранилища реляционных данных, а это означает, что разработчики имеют согласованную модель программирования для работы независимо от основного хранилища данных. Это может быть очень полезно в ситуациях, когда вы разрабатываете продукт, который вы хотите гарантировать, будет взаимодействовать с широким спектром распространенных СУБД.

Другая ситуация, в которой эта абстракция полезна, - это то, что вы являетесь частью команды разработчиков, которая работает с несколькими разными клиентами или разными бизнес-единицами в организации, и вы хотите повысить производительность труда разработчиков за счет сокращения количества СУБД, которым они должны стать. знакомы с тем, чтобы поддерживать ряд различных приложений поверх различных СУБД.

Saille
источник
15

Я обнаружил, что не могу использовать несколько баз данных в рамках одной модели базы данных при использовании EF. Но в linq2sql я мог бы просто с помощью префикса имена схемы с именами базы данных.

Это было одной из причин, по которой я начал работать с linq2sql. Я не знаю, разрешил ли EF эту функцию, но я помню, что читал, что она предназначена для того, чтобы не допустить этого.

Banford
источник
12

Если ваша база данных проста и понятна, LINQ to SQL подойдет. Если вам нужны логические / абстрагированные сущности поверх ваших таблиц, тогда переходите к Entity Framework.

vintana
источник
4
Entity Framework допускает слой абстракции вершины базы данных. Проблема многих OR Mapper сегодня (на мой взгляд) заключается в том, что они обеспечивают отображение 1: 1 между таблицами и классами. Модель базы данных не всегда отражает то, что мы думаем об этом с точки зрения бизнес-модели.
Senfo
Не хватило места. Во всяком случае, основываясь на том, что я сказал выше, я бы сказал, что ваш ответ не полный.
Senfo
7
Я думаю, что это действительно плохой совет. L2S хорош независимо от простоты или сложности вашей базы данных. Настоящая ловушка не имеет надлежащего разделения интересов. Если вы попытаетесь объединить свой бизнес-уровень и уровень доступа к данным и использовать свои объекты Linqed up для всего, тогда вы обнаружите ограничение L2S. Но это проблема чрезмерно упрощенного и монолитного дизайна. L2S делает отличный DAL, и если вы рассматриваете запросы и постоянство отдельно от своих бизнес-правил, вы в конечном итоге избавите себя от множества проблем во многих областях.
mattmc3
1
это ничего не говорит мне Что просто в ваших терминах?
PositiveGuy
1
и что ты имеешь в виду в качестве примера необходимости "логического / абстрактного". Да, я знаю, что такое абстракция, но пример в вашем контексте, пожалуйста ... объясните мне точно, что вы говорите ... опишите это, не просто дайте мне общий сленг ... это все относительно высказывания оратора эти слова, поэтому я понятия не имею, что ВЫ подразумеваете под этим.
PositiveGuy
8

Ни один из них еще не поддерживает уникальные типы данных SQL 2008. Разница с моей точки зрения заключается в том, что у Entity все еще есть шанс построить модель вокруг моего географического типа данных в каком-то будущем выпуске, и Linq to SQL, если от него отказаться, никогда не будет.

Интересно, что случилось с nHibernate или OpenAccess ...

Джон Дунаган
источник
3
SQL Server 2008 Пространственные типы данных (Open Geospatial Consortium OGS), поддерживаемые в Entity Framework 5. Также поддерживаются другие поставщики (Devart для Oracle). См. Msdn.microsoft.com/en-us/data/dn194325 .
subsci
6

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

Linq2Sql может быть хорошим союзником, если использовать его вместе с LinQ, это обеспечит отличные сроки разработки.

MRFerocius
источник
4
"нет странных вещей в середине", хорошо, что вы подразумеваете под этим. Пример «странной вещи посередине»
PositiveGuy
Было бы неплохо отредактировать или удалить этот ответ, он больше не полезен для современной разработки и может привести людей на неверный путь.
Джулио Качин,
6

Я работаю на клиента, у которого есть большой проект, использующий Linq-to-SQL. Когда проект начинался, это был очевидный выбор, потому что в Entity Framework в то время отсутствовали некоторые основные функции, а производительность Linq-to-SQL была намного выше.

Сейчас EF эволюционировал, и в Linq-to-SQL отсутствует асинхронная поддержка, которая отлично подходит для сильно масштабируемых сервисов. Иногда у нас более 100 запросов в секунду, и, несмотря на то, что мы оптимизировали наши базы данных, большинство запросов все еще занимает несколько миллисекунд. Из-за синхронных вызовов базы данных поток заблокирован и недоступен для других запросов.

Мы думаем перейти на Entity Framework, исключительно для этой функции. Жаль, что Microsoft не внедрила асинхронную поддержку в Linq-to-SQL (или с открытым исходным кодом, чтобы сообщество могло это сделать).

Приложение за декабрь 2018 года: Microsoft движется в направлении .NET Core, а Linq-2-SQL не поддерживает .NET Core, поэтому вам нужно перейти на EF, чтобы в будущем можно было перейти на EF.Core.

Есть также некоторые другие варианты, такие как LLBLGen . Это зрелое решение ORM, которое существует уже долгое время и оказалось более перспективным, чем решения для данных MS (ODBC, ADO, ADO.NET, Linq-2-SQL, EF, EF.core).

Рамон де Кляйн
источник
2

Linq к SQL

Это провайдер, он поддерживает только SQL Server. Это технология отображения для сопоставления таблиц базы данных SQL Server с объектами .NET. Это первая попытка Microsoft создать ORM - объектно-реляционный маппер.

Linq к Entities

Это та же идея, но с использованием Entity Framework в фоновом режиме, как ORM - опять-таки от Microsoft. Он поддерживает несколько баз данных. Основное преимущество Entity Framework - разработчик может работать с любой базой данных, нет необходимости изучать синтаксис для выполнения каких-либо операций с различными различными базами данных.

Согласно моему личному опыту, Ef лучше (если вы не имеете представления о SQL), производительность в LINQ немного выше по сравнению с языком LINQ по причине EF, написанным на лямбде.

Уманг Патва
источник