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 не может сделать самостоятельно?
17 ответов
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 для реляционных данных
Я думаю, что быстрый и грязный ответ заключается в том, что
- LINQ to SQL - это простой и быстрый способ сделать это. Это означает, что вы будете работать быстрее и быстрее, если работаете над чем-то меньшим.
- Entity Framework - это универсальный, не имеющий запретов способ сделать это. Это означает, что вы потратите больше времени на авансирование, будете медленнее развиваться и будете более гибкими, если будете работать над чем-то большим.
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 для реляционных сценариев.
В этой статье @lars опубликовано несколько очевидных отличий, но короткий ответ:
- L2S тесно связан - свойство объекта с конкретным полем базы данных или, точнее, сопоставление объекта с конкретной схемой базы данных
- L2S будет работать только с SQL Server (насколько я знаю)
- EF позволяет отображать один класс на несколько таблиц
- EF будет обрабатывать отношения MM
- EF будет иметь возможность предназначаться для любого поставщика данных ADO.NET
Первоначально предполагалось, что L2S предназначен для быстрой разработки, а EF - для более "корпоративных" n-уровневых приложений, но это продает L2S немного меньше.
LINQ to SQL
- Однородный источник данных: SQL Server
- Рекомендуется только для небольших проектов, где структура данных хорошо разработана
- Сопоставление можно изменить без перекомпиляции с помощью SqlMetal.exe.
- .dbml (язык разметки базы данных)
- Индивидуальное отображение между таблицами и классами
- Поддерживает наследование TPH
- Не поддерживает сложные типы
- Подход к хранилищу
- База данных-ориентированное представление базы данных
- Создано командой C#
- Поддерживается, но дальнейшие улучшения не предусмотрены
Entity Framework
- Источник данных Heterogeneus: поддержка многих поставщиков данных
- Рекомендуется для всех новых проектов, кроме:
- маленькие (LINQ to SQL)
- когда источником данных является плоский файл (ADO.NET)
- Сопоставление может быть изменено без перекомпиляции при настройке файлов модели и сопоставления. Процесс артефакта метаданных для копирования в каталог вывода
- .edmx (Entity Data Model), которая содержит:
- SSDL (язык определения схемы хранения)
- CSDL (язык определения концептуальной схемы)
- MSL (язык спецификации картографирования)
- Отображения один-к-одному, один-ко-многим, многие-к-одному между таблицами и классами
- Поддерживает наследование:
- TPH (таблица на иерархию)
- TPT (таблица по типу)
- TPC (таблица на конкретный класс)
- Поддерживает сложные типы
- Подходы "сначала код", "сначала модель", "сначала хранилище"
- Ориентированное на приложение представление базы данных
- Создано командой SQL Server
- Будущее API данных Microsoft
Смотрите также:
Мой опыт работы с Entity Framework был менее чем звездным. Во-первых, вы должны наследовать от базовых классов EF, так что попрощайтесь с POCO. Ваш дизайн должен быть вокруг EF. С LinqtoSQL я мог использовать свои существующие бизнес-объекты. Кроме того, нет ленивой загрузки, вы должны реализовать это самостоятельно. Есть некоторые способы использования POCO и отложенной загрузки, но они существуют, IMHO, потому что EF еще не готов. Я планирую вернуться к нему после 4.0
Я нашел очень хороший ответ, который объясняет, когда использовать то, что простыми словами:
Основное правило, для которого следует использовать платформу, - как планировать редактирование данных на уровне презентации.
Linq-To-Sql - используйте эту платформу, если вы планируете редактировать взаимно-однозначное соотношение ваших данных на уровне презентации. Это означает, что вы не планируете объединять данные из более чем одной таблицы в одном представлении или странице.
Entity Framework - используйте эту платформу, если вы планируете объединять данные из более чем одной таблицы в вашем представлении или странице. Чтобы сделать это более понятным, приведенные выше термины относятся к данным, которые будут обрабатываться в вашем представлении или на странице, а не просто отображаться. Это важно понимать.
С Entity Framework вы можете "объединить" данные таблицы вместе, чтобы представить их на уровне представления в редактируемой форме, а затем, когда эта форма будет отправлена, EF будет знать, как обновить ВСЕ данные из различных таблиц.
Вероятно, есть более точные причины для выбора EF вместо L2S, но это, вероятно, будет легче понять. L2S не имеет возможности объединять данные для представления презентации.
У меня сложилось впечатление, что ваша база данных довольно обширна или очень плохо спроектирована, если Linq2Sql не соответствует вашим потребностям. У меня есть около 10 веб-сайтов, больше и меньше, и все используют Linq2Sql. Я смотрел и Entity Framework много раз, но я не могу найти вескую причину для его использования над Linq2Sql. Тем не менее, я пытаюсь использовать свои базы данных в качестве модели, поэтому у меня уже есть соотношение 1: 1 между моделью и базой данных.
На моей текущей работе у нас есть база данных с более чем 200 таблицами. Старая база данных с множеством плохих решений, поэтому я мог видеть преимущество Entity Framework по сравнению с Linq2Sql, но все же я бы предпочел изменить структуру базы данных, поскольку база данных является ядром приложения, а если база данных плохо спроектирована и работает медленно, тогда мое приложение также будет медленным. Использование Entity Framework в такой базе данных кажется быстрым исправлением для маскировки плохой модели, но она никогда не сможет скрыть плохую производительность, которую вы получаете от такой базы данных.
Вы можете найти хорошее сравнение здесь:
http://www.c-sharpcorner.com/blogs/entity-framework-vs-linq-to-sql1
Ответы, приведенные здесь, охватывают многие различия между 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 мощной программной абстракцией для вашего хранилища реляционных данных, а это означает, что разработчики имеют согласованную модель программирования для работы независимо от базового хранилища данных. Это может быть очень полезно в ситуациях, когда вы разрабатываете продукт, который хотите обеспечить совместимостью с широким спектром СУБД.
Другая ситуация, когда эта абстракция полезна, - это то, когда вы являетесь частью команды разработчиков, которая работает с рядом разных клиентов или с различными бизнес-единицами в организации, и вы хотите повысить производительность труда разработчиков за счет сокращения количества СУБД, которым они должны стать. знакомы с тем, чтобы поддерживать ряд различных приложений поверх различных СУБД.
Я обнаружил, что не могу использовать несколько баз данных в рамках одной модели базы данных при использовании EF. Но в linq2sql я мог бы просто с помощью префикса имена схемы с именами базы данных.
Это было одной из причин, по которой я начал работать с linq2sql. Я не знаю, разрешил ли EF эту функцию, но я помню, что читал, что она предназначена для того, чтобы не допустить этого.
Если ваша база данных проста и понятна, LINQ to SQL подойдет. Если вам нужны логические / абстрагированные сущности поверх ваших таблиц, тогда переходите к Entity Framework.
Ни один из них еще не поддерживает уникальные типы данных SQL 2008. Разница с моей точки зрения заключается в том, что у Entity все еще есть шанс построить модель вокруг моего географического типа данных в каком-то будущем выпуске, и Linq to SQL, если от него отказаться, никогда не будет.
Интересно, что случилось с nHibernate или OpenAccess...
Я работаю на клиента, у которого есть большой проект, использующий Linq-to-SQL. Когда проект начинался, это был очевидный выбор, потому что в Entity Framework в то время отсутствовали некоторые основные функции, а производительность Linq-to-SQL была намного выше.
Сейчас EF эволюционировал, и в Linq-to-SQL отсутствует основная функция для масштабируемых сервисов, а именно поддержка асинхронных операций. Иногда у нас более 100 запросов в секунду, и, несмотря на то, что мы оптимизировали наши базы данных, большинство запросов все еще занимает несколько миллисекунд. Из-за синхронных вызовов базы данных поток заблокирован и недоступен для других запросов.
Мы думаем о переходе на Entity Framework, исключительно для этой функции. Жаль, что Microsoft не внедрила асинхронную поддержку в Linq-to-SQL (или с открытым исходным кодом, чтобы сообщество могло это сделать).
Я думаю, что если вам нужно быстро что-то разработать без каких-либо странных вещей в середине, и вам нужна возможность иметь сущности, представляющие ваши таблицы:
Linq2Sql может быть хорошим союзником, если использовать его вместе с LinQ, это обеспечит отличные сроки разработки.
Linq к SQL
Это провайдер, он поддерживает только SQL Server. Это технология отображения для сопоставления таблиц базы данных SQL Server с объектами.NET. Это первая попытка Microsoft создать ORM - объектно-реляционный маппер.
Linq к Entities
Это та же идея, но с использованием Entity Framework в фоновом режиме, так как ORM - опять-таки от Microsoft. Он поддерживает несколько баз данных. Основным преимуществом Entity Framework является то, что разработчик может работать с любой базой данных, нет необходимости изучать синтаксис для выполнения каких-либо операций с различными различными базами данных
Согласно моему личному опыту, Ef лучше (если вы не имеете представления о SQL), производительность в LINQ немного выше по сравнению с языком LINQ по причине EF, написанным на лямбде.
Вот несколько показателей, ребята... (КОЛИЧЕСТВО ВЕЩЕЙ!!!!)
Я взял этот запрос, где использовал Entity Framework
var result = (from metattachType in _dbContext.METATTACH_TYPE
join lineItemMetattachType in _dbContext.LINE_ITEM_METATTACH_TYPE on metattachType.ID equals lineItemMetattachType.METATTACH_TYPE_ID
where (lineItemMetattachType.LINE_ITEM_ID == lineItemId && lineItemMetattachType.IS_DELETED == false
&& metattachType.IS_DELETED == false)
select new MetattachTypeDto()
{
Id = metattachType.ID,
Name = metattachType.NAME
}).ToList();
и изменил его на то, где я использую шаблон репозитория Linq
return await _attachmentTypeRepository.GetAll().Where(x => !x.IsDeleted)
.Join(_lineItemAttachmentTypeRepository.GetAll().Where(x => x.LineItemId == lineItemId && !x.IsDeleted),
attachmentType => attachmentType.Id,
lineItemAttachmentType => lineItemAttachmentType.MetattachTypeId,
(attachmentType, lineItemAttachmentType) => new AttachmentTypeDto
{
Id = attachmentType.Id,
Name = attachmentType.Name
}).ToListAsync().ConfigureAwait(false);
Linq-в-sql
return (from attachmentType in _attachmentTypeRepository.GetAll()
join lineItemAttachmentType in _lineItemAttachmentTypeRepository.GetAll() on attachmentType.Id equals lineItemAttachmentType.MetattachTypeId
where (lineItemAttachmentType.LineItemId == lineItemId && !lineItemAttachmentType.IsDeleted && !attachmentType.IsDeleted)
select new AttachmentTypeDto()
{
Id = attachmentType.Id,
Name = attachmentType.Name
}).ToList();
Кроме того, обратите внимание, что Linq-to-Sql в 14 раз быстрее, чем Linq...
LINQ to SQL и Entity Framework выглядят одинаково на поверхности. Они оба обеспечивают LINQ-запросы к базе данных с использованием модели данных.
LINQ to SQL возникла из проекта LINQ, созданного командой, занимающейся разработкой языка. В то время Entity Framework был проектом команды Data Programmability и был сосредоточен на языке Entity SQL. Microsoft не намерена ограничивать LINQ to SQL.
LINQ to SQL по-прежнему является частью ADO.NET, в то время как платформа Entity имеет отдельный API. Платформа Entity Framework - это более поздняя версия LINQ to SQL. Платформа Entity использует Entity Data Model для соединения между вашим приложением и вашим хранилищем данных. Именно Entity Data Model, или EDM, обеспечивает определение вашей концептуальной схемы, а также информацию о схеме базы данных, необходимую для взаимодействия с базой данных, и, наконец, схему сопоставления, которая связана с двумя.
Вот некоторые задачи, выполняемые Entity Framework(модель данных Entity).
• Автоматически генерирует классы из модели и динамически обновляет эти классы при каждом изменении модели.
• Заботится обо всех возможностях подключения к базе данных, чтобы разработчики не были обременены необходимостью писать много кода для взаимодействия с базой данных.
• Предоставляет общий синтаксис запросов для запросов к модели, а не к базе данных, а затем переводит эти запросы в запросы, понятные базе данных.
• Предоставляет механизм для отслеживания изменений объектов модели по мере их использования в приложениях и обрабатывает обновления базы данных.