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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
9
0
2 033
11
Перейти к ответу Данный вопрос помечен как решенный

Ответы 11

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

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

В нем нет всего необходимого для переноса объектов с одного контроллера домена на другой. Однако это можно легко добавить - см. Класс LinqSync в конце этой статьи: blog.huagati.com/res/index.php/2008/06/23/…

KristoferA 06.10.2008 09:09

Я забочусь о «правильном распределении слоев моего приложения», и мне все еще нравится linq-to-sql.

liammclennan 23.12.2008 05:29
Ответ принят как подходящий

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

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

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

Он отменяется в пользу Entity Framework.

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

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

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

Что делать, если вы не пользуетесь дизайнером или генератором кода? Сопоставление может быть выполнено с помощью атрибутов или конфигурации XML - реакция на изменение схемы в этом случае с помощью Linq to SQL будет аналогична другим ORM, не так ли?

Erik Forbes 03.10.2008 03:58

Поверь мне, Эрик, ты не хочешь делать сопоставление вручную. Вам нужно установить слишком много атрибутов. Еще одна вещь, которую конструктор LINQ to SQL очень глючит.

azamsharp 03.10.2008 03:59

Совершенно верно, но типичный пользователь LINQ to SQL обычно не будет взламывать XML, но это правда, все ограничения как в LINQ 2 SQL, так и в EF находятся в опыте дизайнера.

johnc 03.10.2008 04:00

Ленивая загрузка требует взлома? Класс DataLoadOption очень удобен, и DeferredLoadingEnabled = false мне не кажется слишком большим взломом?

Codewerks 03.10.2008 04:10

AugustLights - Спасибо, я еще раз посмотрю на это, так как я могу делать это не оптимально

johnc 03.10.2008 04:32

Я использую LINQ to SQL в своем новейшем проекте, и мне это нравится. После того, как я прошел через кривую обучения, у меня нет проблем. Я создал свои собственные объекты, и обычно при изменении базы данных требуется изменение кода независимо от того, что вы используете для доступа к данным.

David Basarab 03.10.2008 16:32

@ Longhorn213, как вы распределяете приложение по слоям? Вы просто помещаете код LINQ to SQL в события пользовательского интерфейса.

azamsharp 03.10.2008 21:49

Re db schema changes - хотя разработчик не поддерживает синхронизацию изменений, есть сторонние инструменты, которые справляются с этим. Одна из них - моя надстройка - Huagati DBML Tools. Вы можете скачать пробную версию с сайта huagati.com/dbmltools, если хотите попробовать.

KristoferA 06.10.2008 08:59

> Вам нужно установить слишком много атрибутов. <Вряд ли. Размещение [Column] в каждом свойстве с IsPrimaryKey = true там, где это необходимо, и несколько [Association], помогут вам.

Lucas 08.10.2008 02:48

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

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

Ах, но тогда для хранимой процедуры нет насмешек.

Graviton 06.10.2008 10:10

Я просто потратил день, пытаясь издеваться над Table <T> различными весьма изобретательными способами, и с отвращением сдался. Ага!

Peter Mounce 11.11.2008 00:33

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

Верно, но не очень интересно.

user1228 03.10.2008 05:11

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

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

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

2) Вы привязаны к однозначному сопоставлению таблиц с классами.

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

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

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

Как я уже упоминал в вопросе, на который я ссылался, это вопрос того, чего вы пытаетесь достичь. Если вы хотите обменять скорость выполнения на скорость разработки, LINQ to SQL может быть хорошим выбором. Если вас беспокоит скорость выполнения, существуют другие доступные ORM / DAL / решения, работа с которыми может занять больше времени, но предоставит вам будущую защиту от изменений схемы и более эффективные решения за счет дополнительных накладных расходов на разработку.

Я скептически отношусь к этому ответу. Каков ваш источник или есть ли способ обосновать этот вывод?

liammclennan 06.10.2008 08:02

Раньше так было до RTM (то есть в бета-версиях). Это уже не так, поскольку это было исправлено до того, как была выпущена окончательная версия RTM.

KristoferA 06.10.2008 09:02

Источник для этого можно найти здесь: connect.microsoft.com/VisualStudio/feedback/…

Jeremiah Peschka 23.10.2008 18:33

Кажется, что переполнение стека справляется нормально.

liammclennan 23.12.2008 05:31

Я считаю, что производительность RTM-версии адекватна (при условии, что запросы написаны правильно). Лучше, чем реализация Entity Framework.

RobS 18.02.2009 14:28
  • Невозможно смешивать ленивую загрузку / нетерпеливую загрузку для контекста данных.
  • Истинное настойчивое невежество очень сложно.
  • Возможности отображения ограничены. Например, нет отношений «многие ко многим».
  • Повторная синхронизация сопоставления с изменениями схемы болезненна.

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

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

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

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

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

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

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

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

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

Другие вопросы по теме