LINQ to SQL или Entities на этом этапе?

Я немного опоздал в игру и решил потратить немного времени на изучение LINQ. В качестве упражнения я собираюсь переписать приложение WebForms в MVC 2 (что для меня тоже в новинку). Мне удалось найти здесь несколько тем, касающихся LINQ (Изучение LINQ, Руководство для начинающих по LINQ, Живой или мертвый LINQ to SQL?), что привлекло мое внимание к проблеме Entities vs SQL.

Тем не менее, всем темам больше года, и я не могу найти какой-либо окончательной информации о том, какой ORM предпочтительнее. Являются ли Entities более или менее LINQ to SQL 2.0 на данном этапе? Еще сложнее пользоваться?

Есть ли причина использовать LINQ to SQL или мне просто перейти к Entities? Приложения, которые я пишу у моего нынешнего работодателя, имеют длительный жизненный цикл (~ 10 лет), поэтому я стараюсь выбрать лучшую доступную технологию.


person orlon    schedule 04.06.2010    source источник
comment
Хорошо вернуться к этому вопросу сейчас, когда .Net 4.0 вышла с большим количеством изменений в обеих технологиях.   -  person DOK    schedule 04.06.2010
comment
Дубликат: stackoverflow.com/questions/2874003/   -  person Michael Maddox    schedule 05.06.2010


Ответы (5)


В недавнем сообщении о расширении NerdDinner Скотт Хансельман говорил именно об этом. Процитировать в конце:

Заключение

Для доступа к базе данных в .NET существует множество вариантов. Вы столкнетесь с DataReaders в более старом или хорошо настроенном коде, но нет причин, по которым он не может быть спрятан в репозитории и по-прежнему приятен в использовании. LINQ to SQL приятный, легкий и быстрый, и в нем есть множество исправлений ошибок в .NET 4, но Entity Framework - это то, как они движутся вперед. Кроме того, Entity Framework 4 - это способ < / em> лучше, чем EF 3.5, поэтому я использую его для любых проектов, которые "больше, чем маленькие", и у меня нет особых проблем.

Конечно, у меня еще не было возможности поиграться с ним, но EF4, похоже, завоевал доверие ряда профессионалов.

person Tom    schedule 04.06.2010
comment
+1. EF4 так же прост, как NHibernate, без огромного объема работы по настройке. Я смог запустить базовое приложение базы данных в кратчайшие сроки. Намного чище, чем EF на 3.5. Но все зависит от того, чего вы хотите; некоторым людям нравится видеть абстракцию БД в коде, чтобы они понимали, что происходит. L2S по-прежнему является отличным вариантом, и его несложно будет преобразовать в EF позже. - person drharris; 04.06.2010
comment
Хорошо читать. Мне нравится, как он дал нам архаичный устаревший народ, все еще использующий DataReaders, - действительно хорошо настроенный. - person orlon; 04.06.2010
comment
@Orlon Я думаю, что комментарий DataReaders более верен, чем в противном случае, поскольку он дает вам более детальный контроль над вашими операторами SQL. Даже в самых последних и великих проектах может возникнуть необходимость в ручной настройке SQL в тот или иной момент. Stack Overflow в некоторых местах использует DataReaders, а в других - LINQ to SQL. Я думаю, это закон дырявых абстракций ... - person Chad Levy; 05.06.2010

Есть ли причина использовать LINQ to SQL или мне просто перейти к Entities?

Я вряд ли объективен (как упорный пользователь LinqToSql), но это ответит.

Технологии объектно-реляционного сопоставления - это попытки решить или уменьшить несоответствие объектно-реляционного импеданса. Они являются мостами между двумя мирами - миром объектов и миром реляционных данных.

И похоже, что разработчики этих мостов вообще называют ту или иную сторону своим домом.

LinqToSql - это ORM со стороны объекта. Он был разработан командой C # и позволяет использовать объекты для представления данных. В LinqToSql нет строк, непрозрачных для компилятора, все запросы проверяются компилятором на соответствие отображению.

EF - это ORM со стороны данных. Он был разработан командой ADO и позволяет использовать данные, представленные в виде объектов. В EF много непрозрачных строк.

В конечном итоге запросы должны выполняться в базе данных, и компилятор не может подтвердить, что база данных, доступная во время выполнения, соответствует отображению (истинно в любом ORM). Из-за реальности мира данных команда данных не ценит гарантии компилятора так же сильно, как команда C #.

Проработав много лет в бэкэнде TSQL, без защиты компилятора, я очень дорожу любой помощью, которую компилятор может мне оказать. И поэтому я на стороне команды C # в этом вопросе.


Например, загрузка клиента с его заказами.

  //linq to sql.
DataLoadOptions load = new DataLoadOptions();
load.LoadWith<Customer>(c => c.Orders);  //<-- strong typed
myDataContext.LoadOptions = load;

IQueryable<Customer> query = myDataContext.Customers
  .Where(c => c.CustomerId == 1);

  //entity framework
IQueryable<Customer> query = myObjectContext.Customers
  .Include("Orders")  // <-- opaque string
  .Where(c => c.Customer.Id == 1);
person Amy B    schedule 04.06.2010
comment
Пожимают плечами. так легко обойти эту проблему, что я могу Не представляю, почему вы приняли решение, основываясь на этой очень незначительной проблеме. Хотите строгую типизацию Include? Ты можешь иметь это. Теперь вы можете принять решение на основе существенных вопросов. - person Craig Stuntz; 07.06.2010
comment
Это не полное решение. А как насчет Customer.Orders.Items? - person Amy B; 07.06.2010
comment
Кроме того, метод Include - не единственный случай - факт остается фактом: во всех своих библиотеках команда C # требует проверки компилятора, а группа ADO - нет. - person Amy B; 07.06.2010
comment
Я не сказал, что это полное решение; Я сказал, что это тривиальная проблема. И я бы не согласился с тем, что это каким-то образом повсеместно. Совсем нетрудно писать приложения EF, которые не используют волшебные строки, точно так же, как нетрудно писать приложения L2S, которые это делают. Наконец, утверждение, что команда ADO не хочет этого, явно абсурдно. Кто, по вашему мнению, владеет LINQ to SQL? - person Craig Stuntz; 07.06.2010

Эта статья похожа на статью Хансельмана. Он сравнивает DataReader (который они называют «подключенным» доступом к данным), типизированный DataSet («отключенный»), LINQ to SQL и Entity Framework. Для всех подходов приведены подробные примеры кода, а также указаны плюсы и минусы каждого подхода.

person DOK    schedule 04.06.2010

Я очень внимательно изучил обе технологии в начале 2009 года и слышал множество слухов о «надвигающейся смерти» LINQ-to-SQL. В конце концов, я все же предпочел LINQ-to-SQL Entity Framework, потому что мне никогда не нравилось работать с ADO.NET, а EF напомнил мне слишком много об этом, потому что он был очень тесно связан с базой данных.

В моих девелоперских проектах моя история всегда заключалась в следующем:

  1. построить схему
  2. построить объекты базы данных, которые работают со схемой
  3. создать уровень данных, который общается с объектами базы данных
  4. построить бизнес-уровень, который общается с уровнем данных

С EF мало что изменилось. С помощью LINQ-to-SQL я смог полностью исключить шаг № 2, чтобы уровень данных мог напрямую взаимодействовать с базой данных, не беспокоясь о динамических операторах SQL или потенциальных уязвимостях, связанных с инъекциями. Вдобавок я получил преимущество гораздо более простого процесса управления изменениями во время цикла разработки. Меня действительно не волнует, какова «официальная» позиция Microsoft, потому что я слышал о «неминуемой смерти» WinForms уже около пяти лет, и это все еще существует.

Microsoft - это прежде всего бизнес. Если они хотят остаться в бизнесе, они дадут клиенту то, что он желает, иначе клиент найдет кого-то другого, более готового удовлетворить его потребности. Если только для устаревших приложений, которые все еще активно используются сегодня, WinForms будет поддерживаться до тех пор, пока операционная система Windows по-прежнему поддерживает приложения Windows 95. Точно так же LINQ-to-SQL будет по-прежнему поддерживаться в той или иной форме. Я считаю, что LINQ-to-SQL останется в обозримом будущем до тех пор, пока он не будет полностью интегрирован в EF, где существующие приложения будут работать в соответствии с первоначальной разработкой (или с минимальной модификацией разработчика).

person Neil T.    schedule 05.06.2010

Я бы предложил использовать Entities или NHibernate, Linq очень тесно связывает базу данных с объектами вашего домена, которые затем используются вашим уровнем представления. Это приведет к сильной связи между уровнем представления и базой данных, что, как правило, не рекомендуется.

Лично мне нравится Entity Framework 4.0, вы можете использовать с ним запросы linq и объекты POCO, которые вы сами кодируете. Он просто обрабатывает всю базу данных / SQL за вас.

person Paul    schedule 04.06.2010