Что не так с Linq для SQL? - PullRequest
       65

Что не так с Linq для SQL?

9 голосов
/ 03 октября 2008

Что не так с Linq to SQL?

Или - что из-за Linq to SQL сделает его непригодным для проекта, нового или существующего? Я хочу услышать о том, почему вы не выбираете Linq to SQL для конкретного проекта, включая параметры проекта, которые делают его непригодным.

Ответы [ 11 ]

16 голосов
/ 03 октября 2008

Не очень адаптируется к изменениям в схеме базы данных. Вы должны перестроить слой dbml и восстановить ваши контексты данных.

Как и любой ORM (я не вступаю в дискуссию о том, является ли он ORM или нет), вы должны знать, какой SQL генерируется и как это повлияет на ваши вызовы.

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

Это закат в пользу Entity Framework

Несмотря на то, что используется модель провайдера, которая позволяет создавать провайдеров для других платформ СУБД, поддерживается только SQL Server.

[ РЕДАКТИРОВАТЬ @ AugustLights - По моему опыту:] Ленивая загрузка может потребовать немного взлома, чтобы начать работать.

При этом, я думаю, что это очень удобно, если использовать правильно

9 голосов
/ 03 октября 2008

Для проекта, который должен использовать базы данных, отличные от SQL Server:

1) Вы заблокированы для использования SQL Server

Для проекта со сложными отношениями сущностей и / или отношениями, которые постепенно изменяются со временем:

2) Вы привязаны к отображению таблиц 1-к-1 в классы

Для проекта, который должен использовать 1.x версии .NET

3) Не работает с .NET 1.x

4 голосов
/ 06 октября 2008
  • Не существует способа смешать-сопоставить ленивую загрузку / энергичную загрузку в текстовом тексте данных.
  • Истинное упорство невежества очень сложно.
  • Варианты картирования ограничены. Например, нет отношений «многие ко многим».
  • Повторная синхронизация сопоставления с изменениями схемы является болезненной.

Несмотря на все вышесказанное, я думаю, что linq-to-sql - отличный выбор для многих проектов.

3 голосов
/ 03 октября 2008

потому что вы не используете 3.5 ... это правильный ответ?!?!?

3 голосов
/ 03 октября 2008

При юнит-тестировании сложно издеваться из-за отсутствия интерфейса в классе System.Data.Linq.DataContext. Вот возможный подход: Mocking LINQ to SQL DataContext .

1 голос
/ 14 апреля 2009

Истинный ORM должен отделить дизайн ваших бизнес-сущностей от вашего постоянного уровня. Таким образом, вы можете выполнить рефакторинг любого из них по отдельности, и вам нужно только поддерживать соответствие между ними. Это уменьшает количество логического кода приложения, которое необходимо поддерживать для изменений базы данных.

Чтобы реализовать такой подход, не зависящий от персистентности, с Linq-to-SQL, вам придется использовать его сгенерированные классы в DTO и поддерживать логику отображения между вашими DTO и вашими сущностями.

Есть гораздо лучшие ORM для такого подхода (например, NHibernate), которые значительно уменьшают потребность в DTO.

1 голос
/ 06 октября 2008

Единственное, что я бы назвал техническим "showtopper", это если вы хотите использовать другие СУБД, кроме SQL Server. (хотя это можно обойти - см. блог Мэтта Уоррена @ http://blogs.msdn.com/mattwar/)

Кроме того, в предыдущих ответах на ваш вопрос уже перечислены некоторые плюсы и минусы. Тем не менее, все негативы, упомянутые до сих пор, имеют обходные пути, так что они на самом деле не демонстрируют успехи.

Нетехнический [потенциальный] showtopper - риск того, что MSFT откажется от него в пользу EF ... Подробнее об этом здесь: http://oakleafblog.blogspot.com/2008/05/is-adonet-team-abandoning-linq-to-sql.html

Хотя (по моему мнению) текущее состояние EF является достаточной причиной для продолжения работы над L2S. Так что давайте надеяться, что они делают ...

1 голос
/ 03 октября 2008

Преимущество LINQ-to-SQL заключается в том, что якобы можно создавать запросы данных прямо в коде на основе строго типизируемых запрашиваемых / перечислимых объектов данных из вашего dbml (который играет роль очень ограниченный DAL). Таким образом, следствием, как уже упоминалось, является то, что это несколько побуждает вас играть за пределами четко определенных и разделенных слоев или уровней для вашего приложения.
Чтобы противостоять этому, это должно означать, что вы должны быть в состоянии исключить большую часть или всю бизнес-логику, которую вы записывали в хранимые процедуры в базе данных, поэтому, по крайней мере, вам нужно только перейти к коду, который обрабатывает данные, чтобы изменить не влияющие на схему бизнес-правила ... Однако это немного ломается, когда вы понимаете, насколько сложно написать запрос с внешним объединением с агрегатами с группировкой, по крайней мере, при первом подходе к нему. Таким образом, у вас возникнет желание написать sprocs в SQL, который, как вы знаете, настолько прост и хорош в выполнении этих вещей, а не тратить дополнительное время на то, чтобы выяснить синтаксис LINQ, чтобы сделать то же самое, когда он просто собирается преобразовать его. все равно безобразный код SQL ...
Сказав это, я действительно люблю LINQ, и мое уважение к нему значительно возросло, когда я начал игнорировать это чувство «синтаксис запроса легче читать», которое я встречал и переключалось на синтаксис метода. Никогда не оглядывался назад.

1 голос
/ 03 октября 2008

Ну, я разработал несколько приложений, использующих LINQ to SQL. Одна из основных проблем, с которыми я сталкиваюсь, это наложение слоя на ваше приложение. В LINQ to SQL классы сущностей очень тесно связаны с кодом доступа к данным. Кроме того, существуют некоторые проблемы с DataContext, что означает, что вы можете использовать объект DataContext для извлечения элемента, но вы не можете перенести элемент (объект) в другой DataContext (по крайней мере, нелегко).

LINQ to SQL будет полезен, если вы не заботитесь о правильном наслоении приложения, а также если все, что вам нужно, - это быстрое создание приложения, также известного как RAPID Application Development.

0 голосов
/ 14 октября 2008

Это , похоже, не поддерживает значений по умолчанию для столбцов БД.

...