Вопрос

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

Мой вопрос заключается в следующем.В чем разница между использованием Entity Framework и LINQ to SQL в качестве ORM?

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

Это было полезно?

Решение

LINQ to SQL поддерживает только сопоставление 1 к 1 таблиц, представлений, процедур и функций базы данных, доступных в 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 to.

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

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

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

LINQ-SQL

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

Entity Framework

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • MySQL
  • Оракул
  • DB2
  • VistaDB
  • SQLite
  • PostgreSQL
  • Информикс
  • U2
  • Сибаза
  • Синергекс
  • Жар-птица
  • Npgsql

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

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

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

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

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

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

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

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

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

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

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

LINQ to SQL и Entity Framework на первый взгляд похожи.Они оба предоставляют запросы LINQ по базе данных с использованием модели данных.

LINQ TO SQL развивался из проекта LINQ, который выступил из команды, работающей с развитием языка. Хотя структура сущности была проектом команды программируемости данных и была сосредоточена на языке сущности SQL.Microsoft не намерена отказываться от LINQ to SQL.

LINQ to SQL по-прежнему является частью ADO.NET, тогда как Entity Framework имеет отдельный API.Платформа Entity — это более высокая версия LINQ to SQL. Платформа Entity использует модель данных Entity для моста между вашим приложением и хранилищем данных.Это модель сущностных данных, или EDM, которая обеспечивает определение вашей концептуальной схемы, а также информацию о схеме базы данных, необходимую для взаимодействия с базой данных, и, наконец, схему сопоставления, которая связана с двумя.

Вот некоторые задачи, выполняемые Entity Framework (модель данных Entity).

• Автоматически генерирует классы из модели и динамически обновляет эти классы в любое время, когда модель меняется.

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

• Предоставляет общий синтаксис запросов для запроса модели, а не базы данных, а затем преобразует эти запросы в запросы, понятные базе данных.

• Предоставляет механизм отслеживания изменений в объектах модели, поскольку они используются в приложениях, и обрабатывает обновления к базе данных.

Linq-to-SQL

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

Linq-to-Entities

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top