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 не может сделать самостоятельно?

12.08.2008 11:04:11
Я думаю, что ответы ниже должны быть пересмотрены, потому что с тех пор, как EF был выпущен, новые разработчики, которые попадают сюда, могут получить неправильное впечатление. EF стал ВЕЛИКОЛЕПНЫМ и легким инструментом с момента его раннего выпуска. Вы просто устанавливаете соединение с БД, и это примерно 90% всего, что вам нужно. Очень быстрое развитие, с опытной точки зрения! Оттуда - LINQ ваш лучший друг. Он легко настраивается, MVC просто в восторге, и людям, которые говорят, что это плохо - узнайте, как им пользоваться в первую очередь (а также заполучите LINQ)!
graumanoz 3.08.2013 14:21:55
Просто так понятно - у вас сейчас нет выбора - MSFT эффективно убил LINQ2SQL в пользу EF. Однако тот факт, что MSF с открытым исходным кодом EF помог ему сосать меньше и определенно становится лучше. Но для любого, кто входит в EF - обязательно поймите, что в EF все еще есть много причуд. Я написал об одном - stackoverflow.com/questions/305092/…
nikib3ro 28.08.2013 21:09:13
@ kape123, (а) LINQ to SQL не является «мертвым»; это все еще годно к употреблению; (b) LINQ to SQL - это стандартный метод доступа к данным в разработке для Windows Phone 8.
Ryan Lundy 28.01.2014 16:00:40
@ user3308043, [ссылка на источник].
Ryan Lundy 20.05.2014 14:01:24
@Kyralessa - С 2010 года (с выпуском .NET4.0, самой последней цитаты, которую я смог найти), MS признала, что , хотя некоторые инвестиции могут быть сделаны в LINQ2SQL, «основная часть наших общих инвестиций будет в Entity Фреймворк."
kmote 6.08.2015 23:05:39
16 ОТВЕТОВ
РЕШЕНИЕ

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 для реляционных данных

480
21.09.2008 03:22:59
похоже, что вы используете LINQ to SQL для запроса в EF
PositiveGuy 29.12.2010 04:15:52
@CoffeeAddict, хотя они очень похожи по стилю, используя лямбды LINQ, каждый API имеет совершенно разные основы. Например, способ, которым LINQ2SQL генерирует SQL-запросы, позволяет использовать функции SQL, в то время как L2E не использует их, или, по крайней мере, не делал с 2008 года.
Kris 31.01.2011 20:41:01
Объектно-ориентированный подход EF делает его действительно простым и удобным в использовании, может быть очень быстро закодирован, управляем. Для меня просто лучший способ доступа к данным.
Antoine Pelletier 26.11.2015 18:46:27
Этот ответ устарел. Теперь Linq to SQL поддерживает отображение one2many
George Lanetz 29.12.2015 13:18:02

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

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

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

94
12.08.2008 11:15:24
Ваша цитата «L2S будет работать только с SQL Server (насколько мне известно)» нуждается в обновлении: проект с открытым исходным кодом «dblinq» заменяет сборку LINQ to SQL тем, который может взаимодействовать с MySQL, PostgreSQL, Ingres, Firebird, SQLite. .. и Microsoft SQL (конечно).
Contango 24.12.2010 11:41:44
подождите ... чтобы EF не создавал тесно связанные объекты DL?
PositiveGuy 30.12.2010 05:21:11
да, первоначальная предпосылка, что L2S не является решением для предприятий, больше не соответствует действительности. Я имею в виду, что StackOverflow работает на L2S и куче других .com, таких как Redbox, и многих других.
PositiveGuy 30.12.2010 05:22:10

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

  • LINQ to SQL - это простой и быстрый способ сделать это. Это означает, что вы будете работать быстрее и быстрее, если работаете над чем-то меньшим.
  • Entity Framework - это универсальный, не имеющий запретов способ сделать это. Это означает, что вы потратите больше времени на предварительную разработку, будете медленнее развиваться и будете более гибкими, если вы работаете над чем-то большим.
199
23.05.2009 00:14:03
Вы также будете стремиться писать меньше строк кода в L2S, чтобы выполнить то же самое, что и в EF. Отсутствие отложенной загрузки в EF означает, что вы всегда проверяете, загружено что-то или нет.
Paul Mendoza 14.10.2009 21:06:12
Брэд, что бы ты предложил для сайта электронной коммерции? Я имею в виду, что я не вижу ничего, кроме простых CRUDs, происходящих там ...
PositiveGuy 22.12.2010 04:30:52
@CoffeeAddict, очевидно, в тройке самых популярных ответов говорится, что L2S означает простой CRUD
IsmailS 28.12.2010 09:43:44
@Banford С EF в .NET 4.0 я думаю, что это лучше, чем L2S. Функции, которых не было в EF в 3.5, которые были добавлены в EF в .NET 4.0, были добавлены в L2S. Ваши операторы LINQ теперь в EF в .NET 4.0 будут выглядеть почти так же, как в L2S. EF предлагает вам несколько дополнительных вещей, которые вы можете сделать сейчас, помимо того, что предлагает L2S.
Paul Mendoza 17.02.2011 18:15:55
Этому ответу уже 5 лет, и он устарел. Entity Framework 6 теперь находится в бета-версии и значительно улучшен, включает в себя отложенную загрузку, поддержку перечислений и т. Д. И т. Д.
Tim 1.08.2013 23:42:58

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

12
17.09.2008 07:22:11
Entity Framework допускает слой абстракции вершины базы данных. Проблема многих OR Mapper сегодня (на мой взгляд) заключается в том, что они обеспечивают отображение 1: 1 между таблицами и классами. Модель базы данных не всегда отражает то, что мы думаем об этом с точки зрения бизнес-модели.
senfo 2.10.2008 00:35:11
Не хватило места. Во всяком случае, основываясь на том, что я сказал выше, я бы сказал, что ваш ответ не полный.
senfo 2.10.2008 00:36:02
Я думаю, что это действительно плохой совет. L2S хорош независимо от простоты или сложности вашей базы данных. Настоящая ловушка не имеет надлежащего разделения интересов. Если вы попытаетесь объединить свой бизнес-уровень и уровень доступа к данным и использовать свои объекты Linqed up для всего, тогда вы обнаружите ограничение L2S. Но это проблема чрезмерно упрощенного и монолитного дизайна. L2S делает отличный DAL, и если вы рассматриваете запросы и постоянство отдельно от своих бизнес-правил, вы в конечном итоге избавите себя от множества проблем во многих областях.
mattmc3 27.07.2010 23:29:08
это ничего не говорит мне Что просто в ваших терминах?
PositiveGuy 30.12.2010 05:27:45
и что ты имеешь в виду в качестве примера необходимости "логического / абстрактного". Да, я знаю, что такое абстракция, но пример в вашем контексте, пожалуйста ... объясните мне точно, что вы говорите ... опишите это, не просто дайте мне общий сленг ... это все относительно высказывания оратора эти слова, поэтому я понятия не имею, что ВЫ подразумеваете под этим.
PositiveGuy 30.12.2010 05:28:34

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 для реляционных сценариев.

109
3.11.2008 15:53:25
На самом деле, нам не нравится EF, потому что у него такой плохой дизайнер и он очень, очень глючный. Я никогда не находил это настолько сложным.
BlueRaja - Danny Pflughoeft 22.04.2010 21:10:26
Множество крупных сайтов электронной коммерции используют LINQ to SQL. Примеры: Redbox, Stackoverflow и т. Д.
PositiveGuy 22.12.2010 04:30:10
Я знаю много хороших разработчиков, которые используют LINQ to SQL и говорят, что эти статьи полностью раздуты. Я согласен. LINQ to SQL использовался в мощных .coms и до сих пор.
PositiveGuy 29.12.2010 04:16:38
Да, вызов .ToString () для целочисленного свойства в запросе L2EF не должен вызывать исключение.
StingyJack 11.03.2011 21:43:29
@ BlueRaja-DannyPflughoeft Это правда после 5 лет?
Vikas Rana 1.12.2015 12:33:36

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

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

36
21.11.2008 19:52:18
Вы упускаете суть - даже с небольшими базами данных вам может потребоваться нечто иное, чем соотношение 1: 1 между таблицами базы данных и объектами кода / домена. Просто зависит от того, сколько абстракции вы хотите в объектах bus / domain.
alchemical 11.02.2010 22:52:00
Я понял это :) Сегодня я люблю кодировать свои бизнес-сущности. Я по-прежнему использую Linq2sql, но только внутри своих репозиториев, где я получаю данные с помощью Linq2sql и преобразую сущности linq2sql в свои собственные бизнес-сущности. Может быть, немного больше работы, чем использование or-mapper, но все же я хотел бы, чтобы на моем бизнес-уровне не было кода, специфичного для OR-mapper.
terjetyl 12.02.2010 10:07:28

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

51
8.12.2008 03:50:54
Отсутствие поддержки POCO - причина номер один, по которой я выбираю LINQ to SQL вместо Entity Framework. Я могу вернуться к EF, когда они включат его в следующую версию, как они обещают. Есть некоторые дополнительные проекты, которые делают POCO для EF, но не достаточно чисто.
Joseph Ferris 14.03.2009 17:30:12
В случае, если кто-то (как я) не знает, что означает POCO: Plain Old CLR Object
CBono 24.09.2010 15:16:12
Я действительно не понимаю, в чем суета по поводу отказа от поддержки POCO ... это еще один уровень абстракции, ребята. Создайте фабрику, добавьте хранилище данных и создайте там свои POCO. В любом случае, это хорошая идея.
EightyOne Unite 12.10.2010 14:42:29
Я слышал, что POCO возможно в EF 4
PositiveGuy 30.12.2010 05:24:56
Поддержка POCO доступна в наши дни, и наследование больше не является обязательным требованием для классов сущностей @CoffeeAddict POCO - это просто простой объект, не зависящий от конкретной структуры и являющийся основной частью современных шаблонов структуры сущностей
Chris McGrath 9.05.2012 13:51:30

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

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

6
14.10.2013 10:22:49
"нет странных вещей в середине", хорошо, что вы подразумеваете под этим. Пример «странной вещи посередине»
PositiveGuy 30.12.2010 05:29:40
Было бы неплохо отредактировать или удалить этот ответ, он больше не полезен для современной разработки и может привести людей на неверный путь.
Giulio Caccin 29.09.2019 19:26:24

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

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

8
19.04.2009 05:48:50
Пространственные типы данных SQL Server 2008 (Open Geospatial Consortium OGS), поддерживаемые в Entity Framework 5. Также поддерживаются другие поставщики (Devart для Oracle). См. Msdn.microsoft.com/en-us/data/dn194325 .
subsci 11.09.2013 07:20:26

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

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

15
17.02.2011 15:36:00

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

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

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

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

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

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

46
23.03.2012 15:52:54

Здесь приведены ответы на многие из различий между 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 мощной программной абстракцией для вашего хранилища реляционных данных, а это означает, что разработчики имеют согласованную модель программирования для работы независимо от базового хранилища данных. Это может быть очень полезно в ситуациях, когда вы разрабатываете продукт, который вы хотите гарантировать, будет взаимодействовать с широким спектром распространенных СУБД.

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

23
17.03.2014 03:19:58

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

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

73
13.05.2015 08:36:58
Это самый актуальный и подробный ответ.
ErTR 16.03.2016 01:36:32
Разве Entity Framework не использует LINQ to SQL, когда, скажем, вы пишете dbSet<Orders>.Where()...ToList()? Я думаю, что вводить Entity Framework в противоположность LINQ to SQL вводит в заблуждение.
Don Cheadle 7.06.2016 19:13:44
@mmcrae EF не использует L2S, оба являются linq-провайдерами для базовых баз данных. Если вы интерпретируете его как Linq-to-a-database, похожий на linq-to-objects и linq-to-xml, то да, оба они похожи в linq-to-a-database. Но нет, EF не использует L2S (или наоборот). Два полностью разделенных инструмента.
Maarten 14.06.2016 12:06:02
«Рекомендуется для всех новых проектов, кроме ... маленьких», я не согласен. Code First - это чрезвычайно быстрый способ начать работу с небольшими проектами. Кроме этого, большое обновление к этому вопросу.
DrewJordan 21.06.2016 15:12:50
Некоторые вещи в ответе не верны. EDMX не требуется, если вы используете Code First. И я не понимаю, как DI вступает в игру, когда вы используете Code First.
Maarten 14.06.2016 12:10:17
Кроме того, Linq to SQL может просто заполнить БД из классов моделей. Не уверен, что он также может генерировать саму БД, но генерация схемы и таблиц относится к возможностям SQL в Linq.
Tom Lint 1.07.2016 12:25:01
Спасибо за ответ, я думаю, что можно использовать sqlmetal.exe docs.microsoft.com/en-us/dotnet/framework/tools/… для генерации кода / отображения из базы данных при использованииLinq to SQL
Vinod Srivastav 19.04.2019 12:11:38

Linq к SQL

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

Linq к Entities

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

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

2
21.02.2017 05:36:24

Я работаю на клиента, у которого есть большой проект, использующий 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).

6
17.12.2018 18:00:28