Теперь, когда выпущен .NET v3.5 SP1 (вместе с VS2008 SP1), у нас теперь есть доступ к .NET entity framework.
У меня такой вопрос. Когда вы пытаетесь выбрать между использованием Entity Framework и LINQ to SQL в качестве ORM, в чем разница?
Насколько я понимаю, Entity Framework (при использовании с LINQ to Entities) - это «старший брат» LINQ to SQL? Если это так - какие преимущества? Что он может сделать того, что LINQ to SQL не может сделать сам по себе?
Просто чтобы было ясно - у вас нет выбора сейчас - MSFT фактически убила LINQ2SQL в пользу EF. Однако тот факт, что EF с открытым исходным кодом MSFT помог ему меньше отстой и определенно становится лучше. Но для тех, кто попадает в EF, обязательно поймите, что в EF все еще есть много причуд. Я писал об одном - stackoverflow.com/questions/305092/…
@ kape123, (а) LINQ to SQL не «мертвый»; это все еще можно использовать; (b) LINQ to SQL - стандартный метод доступа к данным при разработке Windows Phone 8.
@Kyralessa Только что откопал эту ветку .. LINQ to SQL "мертвый", как и в, официально не поддерживается Microsoft.
@ user3308043, [необходима ссылка].
@Kyralessa - Начиная с 2010 года (с выпуском .NET4.0, самое последнее упоминание, которое я смог найти), М.С. признал, что, хотя некоторые инвестиции могут быть сделаны в LINQ2SQL, «основная часть наших общих инвестиций будет в Entity Framework. "
@HameedSyed, это неправда, это Dapper, его даже разработала SO (Сэм Саффро).





В опубликованной статье @lars есть ряд очевидных различий, но краткий ответ:
Первоначально L2S предназначался для быстрой разработки, а EF - для более "корпоративных" n-уровневых приложений, но это немного сокращает продажи L2S.
Ваша цитата «L2S будет работать только с SQL Server (насколько я знаю)» нуждается в обновлении: проект с открытым исходным кодом «dblinq» заменяет сборку LINQ to SQL на сборку, которая может взаимодействовать с MySQL, PostgreSQL, Ingres, Firebird, SQLite. .. и Microsoft SQL (конечно).
подождите ... значит, EF не создает сильно связанные объекты DL?
да, исходная посылка о том, что L2S не является корпоративным решением, больше не соответствует действительности. Я имею в виду, что StackOverflow работает на L2S и на множестве других .com, таких как Redbox и многих других.
Я думаю, что быстрый и грязный ответ заключается в том, что
Вы также будете склонны писать меньше строк кода с L2S, чтобы добиться того же, что и с EF. Отсутствие ленивой загрузки в EF означает, что вы всегда проверяете, загружено что-то или нет.
Брэд, что бы вы посоветовали для сайта электронной торговли? Я имею в виду, что я не вижу ничего, кроме простых CRUD, происходящих там ...
@CoffeeAddict, очевидно, в тройке самых популярных ответов говорится, что L2S для простого CRUD
@Paul Mendoza Теперь, когда EF поддерживает ленивую загрузку, вы все равно скажете, что L2S требует меньше строк кода? В настоящее время я работаю с L2S и подумываю о переходе на EF, поскольку мое простое приложение CRUD становится чем-то гораздо более крупным и сложным. Я согласен, что без ленивой загрузки EF я бы держался подальше.
@Banford С EF в .NET 4.0 я думаю, что он лучше L2S. Функции, отсутствующие в EF в 3.5, но L2S были добавлены в EF в .NET 4.0. Теперь ваши операторы LINQ в EF в .NET 4.0 будут выглядеть примерно так же, как в L2S. EF дает вам несколько дополнительных вещей, которые вы можете сделать прямо сейчас, помимо того, что предлагает L2S.
Этому ответу уже 5 лет, и он довольно устарел. Entity Framework 6 сейчас находится в бета-версии и значительно улучшен, включает ленивую загрузку, поддержку перечислений и т. д. И т. Д.
Если ваша база данных проста и понятна, подойдет LINQ to SQL. Если вам нужны логические / абстрактные сущности поверх ваших таблиц, выберите Entity Framework.
Entity Framework позволяет создать уровень абстракции в верхней части базы данных. Проблема со многими OR Mappers сегодня (на мой взгляд) заключается в том, что они обеспечивают сопоставление 1: 1 между таблицами и классами. Модель базы данных не всегда отражает то, как мы думаем о ней с точки зрения бизнес-модели.
Кончилось место. В любом случае, основываясь на том, что я сказал выше, я бы сказал, что ваш ответ неполный.
Я считаю, что это действительно плохой совет. L2S - это хорошо несмотря на простоты или сложности вашей базы данных. Настоящая ловушка - это отсутствие должного разделения проблем. Если вы попытаетесь объединить свой бизнес-уровень и уровень доступа к данным и использовать свои Linqed-объекты для всего, вы обнаружите ограничение L2S. Но это проблема излишне упрощенного и монолитного дизайна. L2S представляет собой отличный DAL, и если вы считаете, что запросы и постоянство являются отдельной заботой ваших бизнес-правил, в долгосрочной перспективе вы избавите себя от множества проблем во многих областях.
это мне ничего не говорит. Что в ваших терминах просто?
и что вы имеете в виду как пример необходимости «логического / абстрактного». Да, я знаю, что такое абстракция, но пример в вашем контексте, пожалуйста ... объясните мне, что именно вы говорите ... опишите это, а не просто используйте общий сленг ... это все относительно того, что говорит говорящий эти слова, поэтому я понятия не имею, что ВЫ имеете в виду под этим.
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 для запроса в EF
@CoffeeAddict, хотя они очень похожи по стилю с использованием лямбда-выражений LINQ, каждый API имеет совершенно разные основы. Например, способ, которым LINQ2SQL генерирует SQL-запросы, позволяет использовать функции SQL, тогда как L2E не делает этого или, по крайней мере, не делает этого с 2008 года.
Объектно-ориентированный подход EF делает его действительно простым и удобным в использовании, его можно очень быстро кодировать, управлять им. Для меня это просто лучший способ доступа к данным.
Этот ответ устарел. Теперь Linq to SQL поддерживает отображение one2many
Действительно ли LINQ to SQL мертв?, Джонатан Аллен для InfoQ.com
Matt Warren describes [LINQ to SQL] as something that "was never even supposed to exist." Essentially, it was just supposed to be stand-in to help them develop LINQ until the real ORM was ready.
...
The scale of Entity Framework caused it to miss the .NET 3.5/Visual Studio 2008 deadline. It was completed in time for the unfortunately named ".NET 3.5 Service Pack 1", which was more like a major release than a service pack.
...
Developers do not like [ADO.NET Entity Framework] because of the complexity.
...
as of .NET 4.0, LINQ to Entities will be the recommended data access solution for LINQ to relational scenarios.
На самом деле, нам не нравится EF, потому что у него такой плохой дизайнер и очень, очень сильно глючит. Я никогда не считал это настолько сложным.
МНОЖЕСТВО крупных сайтов электронной коммерции используют LINQ to SQL. Примеры: Redbox, Stackoverflow и т. д.
Я знаю МНОГО хороших разработчиков, которые используют LINQ to SQL, и говорят, что эти статьи полностью преувеличены. Я согласен. LINQ to SQL использовался и до сих пор используется в мощных доменах .com.
Да, вызов .ToString () для целочисленного свойства в запросе L2EF не должен вызывать исключения.
ИМХО, если вы полагаясь в дизайнере, тогда вы настраиваете себя на проблемы позже, я использую только дизайнеров для быстрой настройки и поддерживаю код там после того, как я использовал дизайнеры, но всегда сталкивался с ограничениями и перешел к лучшим вещам, таким как использование фреймворки code first для сопоставления существующих баз данных с кодом и использования мощных инструментов ef для быстрой настройки
@ BlueRaja-DannyPflughoeft Это все еще правда спустя более 5 лет?
@VikasRana дизайнер все равно укусит вас за задницу, если у вас есть конфликт слияния с файлами .edmx даже в 2016 году, вместо этого используйте Code First
Еще 5 лет, интересно, так ли это до сих пор? Я имею в виду, что если я знаю SQL и LINQ, почему я просто не могу этого сделать? Стоит ли тратить время на изучение EF для большого проекта?
Ха ... Итак, я был там (вроде), когда началось все обсуждение LINQ vs Entity Framework ... Мои воспоминания отличаются от воспоминаний Мэтта Уоррена. Между людьми из команды C#, управляющей LINQ, и командой SQL, управляющей фреймворком сущностей, возник явный конфликт. Были разные сообщения в блогах от разных людей, утверждающих, что это «будущее технологий доступа к данным». Это привело к тому, что 2 технических парня ударились головами. В результате этого компромиссом стал Linq to Entity Framework. В любом случае, люди из LINQ в то время ... не думали, что они «никогда не должны были существовать».
У меня сложилось впечатление, что ваша база данных довольно велика или очень плохо спроектирована, если Linq2Sql не соответствует вашим потребностям. У меня около 10 веб-сайтов, больших и малых, и все они используют Linq2Sql. Я много раз смотрел Entity framework, но не могу найти веской причины использовать его поверх Linq2Sql. Тем не менее, я пытаюсь использовать свои базы данных в качестве модели, поэтому у меня уже есть сопоставление 1 к 1 между моделью и базой данных.
На моей текущей работе у нас есть база данных с более чем 200 таблицами. Старая база данных с множеством плохих решений, поэтому я мог видеть преимущество Entity Framework над Linq2Sql, но все же я бы предпочел перепроектировать базу данных, поскольку база данных является движком приложения, и если база данных плохо спроектирована и работает медленно, тогда мое приложение тоже будет медленным. Использование Entity framework в такой базе данных кажется быстрым исправлением, чтобы замаскировать плохую модель, но оно никогда не сможет замаскировать плохую производительность, которую вы получаете от такой базы данных.
Вы упускаете суть - даже с небольшими базами данных вам может потребоваться нечто иное, чем отношение 1: 1 между таблицами базы данных и объектами кода / домена. Просто зависит от того, сколько абстракции вы хотите в объектах шины / домена.
Я это понял :) Сегодня я люблю вручную кодировать свои бизнес-сущности. Я все еще использую Linq2sql, но только в своих репозиториях, где я получаю данные с помощью Linq2sql и конвертирую сущности linq2sql в свои собственные бизнес-объекты. Может быть, немного больше работы, чем использование or-mapper, но все же мне нравится, чтобы мой бизнес-уровень был свободен от какого-либо кода, специфичного для OR-mapper.
Мой опыт работы с Entity Framework был менее чем звездным. Во-первых, вы должны унаследовать от базовых классов EF, так что попрощайтесь с POCO. Ваш дизайн должен быть ориентирован на EF. С LinqtoSQL я мог использовать свои существующие бизнес-объекты. Кроме того, нет ленивой загрузки, вы должны реализовать это самостоятельно. Есть некоторые способы использования POCO и отложенной загрузки, но они существуют, IMHO, потому что EF еще не готов. Планирую вернуться к нему после 4.0
Отсутствие поддержки POCO - это причина номер один, по которой я предпочитаю LINQ to SQL Entity Framework. Я могу вернуться к EF, когда они включат его в следующую версию, поскольку они обещают это сделать. Есть несколько дополнительных проектов, которые выполняют POCO для EF, но недостаточно чисто.
Если кто-то (например, я) не знает, что означает POCO: Обычный старый объект CLR
Я действительно не понимаю, в чем большая суета по поводу отказа от поддержки POCO ... это еще один уровень абстракции, ребята. Создайте фабрику, внедрив репозиторий данных и постройте там свои POCO. В любом случае, это, наверное, хорошая идея.
Я слышал, что POCO возможен в EF 4
Также я до сих пор не имею представления о хорошем примере объекта POCO. Страница Wiki бесполезна с точки зрения описания в реальных терминах и примерах, что POCO фактически используется в реальном приложении ... отсутствие примеров не означает для меня никакой помощи.
Поддержка POCO доступна в наши дни, и наследование больше не является требованием для классов сущностей @CoffeeAddict POCO - это просто простой объект, не зависящий от конкретной структуры, и это основная часть современных шаблонов структуры сущностей.
Я думаю, если вам нужно быстро разработать что-то без каких-либо странных вещей в середине, и вам нужна возможность иметь объекты, представляющие ваши таблицы:
Linq2Sql может быть хорошим союзником, использование его с LinQ дает возможность быстро развиваться.
"Нет Странных вещей посередине", хорошо, что ВЫ имеете в виду под этим. Пример «странной вещи посередине»
Было бы неплохо отредактировать или удалить этот ответ, он больше не полезен для современной разработки и может сбить людей с пути.
Ни один из них еще не поддерживает уникальные типы данных SQL 2008. С моей точки зрения, разница в том, что у Entity все еще есть шанс построить модель на основе моего географического типа данных в каком-то будущем выпуске, а от Linq to SQL никогда не будет.
Интересно, что случилось с nHibernate или OpenAccess ...
Типы пространственных данных SQL Server 2008 (Open Geospatial Consortium OGS) поддерживаются начиная с Entity Framework 5. Также поддерживаются другие поставщики (Devart для Oracle). См. msdn.microsoft.com/en-us/data/dn194325.
Я обнаружил, что не могу использовать несколько баз данных в одной модели базы данных при использовании EF. Но в linq2sql я мог просто добавить к именам схем имена баз данных.
Это была одна из причин, по которой я изначально начал работать с linq2sql. Я не знаю, разрешил ли EF эту функцию, но я помню, как читал, что это было предназначено для того, чтобы этого не было.
Я нашел очень хороший ответ здесь, который простыми словами объясняет, когда что использовать:
The basic rule of thumb for which framework to use is how to plan on editing your data in your presentation layer.
Linq-To-Sql - use this framework if you plan on editing a one-to-one relationship of your data in your presentation layer. Meaning you don't plan on combining data from more than one table in any one view or page.
Entity Framework - use this framework if you plan on combining data from more than one table in your view or page. To make this clearer, the above terms are specific to data that will be manipulated in your view or page, not just displayed. This is important to understand.
With the Entity Framework you are able to "merge" tabled data together to present to the presentation layer in an editable form, and then when that form is submitted, EF will know how to update ALL the data from the various tables.
There are probably more accurate reasons to choose EF over L2S, but this would probably be the easiest one to understand. L2S does not have the capability to merge data for view presentation.
Ответы здесь охватывают многие различия между Linq2Sql и EF, но есть ключевой момент, которому не уделялось много внимания: Linq2Sql поддерживает только SQL Server, тогда как EF имеет поставщиков для следующих СУБД:
Предоставлено Microsoft:
Через сторонних поставщиков:
назвать несколько.
Это делает EF мощной абстракцией программирования над вашим реляционным хранилищем данных, а это означает, что у разработчиков есть согласованная модель программирования, с которой можно работать независимо от базового хранилища данных. Это может быть очень полезно в ситуациях, когда вы разрабатываете продукт, который, как вы хотите, будет взаимодействовать с широким спектром обычных СУБД.
Другая ситуация, в которой эта абстракция полезна, - это когда вы являетесь частью группы разработчиков, которая работает с несколькими разными клиентами или разными бизнес-единицами внутри организации, и вы хотите повысить продуктивность разработчиков за счет уменьшения количества СУБД, которыми они должны стать. знакомы, чтобы поддерживать ряд различных приложений поверх различных СУБД.
Смотрите также:
Это самый актуальный и подробный ответ.
Разве Entity Framework использовать LINQ to SQL не работает, когда, скажем, вы пишете dbSet<Orders>.Where()...ToList()? Я думаю, что это заблуждение, когда Entity Framework противопоставляется LINQ to SQL.
@mmcrae EF не поддерживает использовать L2S, оба являются поставщиками linq для базовых данных. Если вы интерпретируете его как Linq-to-a-database, похожий на linq-to-objects и linq-to-xml, то да, оба похожи в linq-to-a-database. Но нет, EF не использует L2S (или наоборот). Два полностью разделенных инструмента.
«Рекомендуется для всех новых проектов, кроме ... небольших» Я не согласен. Code First - это чрезвычайно быстрый способ начать работу с небольшими проектами. Кроме этого, отличное обновление этого вопроса.
Как определить, что проект «маленький» или «большой»?
Здесь вы можете найти хорошее сравнение:
http://www.c-sharpcorner.com/blogs/entity-framework-vs-linq-to-sql1
Некоторые вещи в ответе неверны. EDMX не требуется, если вы используете Code First. И я не понимаю, как DI вступает в игру, когда вы используете Code First.
Кроме того, Linq to SQL может отлично заполнять БД из классов модели. Не уверен, что он также может генерировать саму БД, но создание схемы и таблиц входит в возможности Linq to SQL.
Спасибо за ответ, я думаю, что можно использовать sqlmetal.exedocs.microsoft.com/en-us/dotnet/framework/tools/… для генерации кода / отображения из базы данных при использовании Linq to SQL
Linq-to-SQL
Это провайдер, он поддерживает только SQL Server. Это технология сопоставления для сопоставления таблиц базы данных SQL Server с объектами .NET. Это первая попытка Microsoft создать ORM - Object-Relational Mapper.
Linq-to-Entities
Это та же идея, но с использованием Entity Framework в фоновом режиме, как ORM - опять же от Microsoft, он поддерживает несколько баз данных. Основное преимущество entity framework - разработчик может работать с любой базой данных, нет необходимости изучать синтаксис для выполнения каких-либо операций с разными разными базами данных.
According to my personal experience Ef is better (if you have no idea about SQL) performance in LINQ is little bit faster as compare to EF reason LINQ language written in lambda.
Я работаю для клиента, у которого есть большой проект, использующий 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).
Вот несколько показателей, ребята ... (КОЛИЧЕСТВЕННОЕ ОПРЕДЕЛЕНИЕ !!!!)
Я взял этот запрос, где использовал 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-to-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 ...
Я думаю, что ответы, приведенные ниже, следует пересмотреть, потому что прошло много времени с момента выпуска EF, поэтому новые разработчики, которые сюда попадают, могут получить неправильное впечатление. EF стал ОТЛИЧНЫМ и ЛЕГКИМ инструментом с момента его первого выпуска. Вы просто устанавливаете соединение с БД, и это вроде 90% всего, что вам нужно. Очень быстрое развитие с точки зрения опытных! Отсюда - LINQ - ваш лучший друг. Он легко настраивается, MVC просто в восторге, а людям, которые говорят, что это плохо - сначала научитесь его использовать (а также закрепите LINQ)!