Re[21]: Entity Framework за! и против!
От: Alexander Polyakov  
Дата: 29.06.14 19:26
Оценка: :)
AP>>CheckAllQueries автоматически генерирует тесты для всех вариантов всех запросов
НС>Тесты это хорошо, но руками править кучу текстовых запросов вместо решарпера при простейшем переименовании поля или таблицы — это надо быть очень убежденным в своей правоте.
Не забываем, что еще есть FindUsages. FindUsages выдаст список [File, Line]. [File, Line] указывает на начало метода с запросом, а там Ctrl-F. А CheckAllQueries это всё проконтролирует. Поэтому не так всё страшно. Используя Roslyn, можно точно позиционироваться на колонку/таблицу (пока не реализовано).
Re[21]: Entity Framework за! и против!
От: Alexander Polyakov  
Дата: 29.06.14 19:29
Оценка:
AP>>С linq2db еще хлеще: выдает неверные данные!!! Код:
IT>Проверил, всё работает как надо.
Вот это надо?

Код:
Console.WriteLine(db.Messages.Select(_ => _.Account.Field1).ToList().Count(i => i == 0));
Console.WriteLine(db.Messages.Select(_ => _.Account.Field1).Count(i => i == 0));
Печатает:
2
1

Re[20]: Entity Framework за! и против!
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 29.06.14 19:31
Оценка: :)
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, gandjustas, Вы писали:


G>>2) Люди пишут Linq запросы не понимая что происходит в базе. Особенно часто встречается FirstOrDefault, который в SQL работает очень медленно, или банально вызывают функции в предикатах.


IT>Что за проблема с FirstOrDefault?

Потому что внутри запроса он преобразуется в select top 1 from (select rownumber() over (...) from t) при некоторых условиях (группировка и еще что-то).
Re[19]: Entity Framework за! и против!
От: Alexander Polyakov  
Дата: 29.06.14 19:35
Оценка:
AP>>Если не сложно опиши, как в таком режиме работать с EF?
IT>А в чём тут проблема?
Проблем нет. Просто хотел уточнить свое понимание. Тексты классов являются перегенерируемыми, т.е. около полей ничего не пишем руками? (иначе всё снесется) В одном из туториалов видел как вручную навешивались ASP MVC атрибуты, значит, это был неправильный туториал.
Re[21]: Entity Framework за! и против!
От: Alexander Polyakov  
Дата: 29.06.14 19:50
Оценка:
IT>И как ощущения? Для меня сегодня рефакторинг БД ничем не отличается от обычного рефакторинга кода. Т.е. вообще ничем. Когда же я писал SQL руками, то это был невероятный геморой.
В связи с этим можно у тебя поинтересоваться, на чём у вас UI? Я очень интересуюсь полным пакетом технологий, где статическая типизация везде: на БД уровне, на серверном и на UI. У вас десктоп или web? Если веб, то html формируете на сервере? или на клиента только данные в виде json уходят? Если второе какой-нибудь клиентский фреймворк используете AngularJS, Ember.js и т.д.? TypeScript используете?

Вроде после появления TypeScript моя мечта о полной статической типизации приложения забрезжила на горизонте. Видимо, какой-то Remote Facade должен быть между клиентским TS и серверным C#. Есть уже что-то готовое для этого?
Re[22]: Entity Framework за! и против!
От: IT Россия linq2db.com
Дата: 29.06.14 20:24
Оценка:
Здравствуйте, Alexander Polyakov, Вы писали:

IT>>Проверил, всё работает как надо.

AP>Вот это надо?

Аналогичный код:

https://github.com/linq2db/linq2db/commit/53924cf402916fd181cc552aaf8c8f99ead534ea

Работает шо железная железяка.
Если нам не помогут, то мы тоже никого не пощадим.
Re[21]: Entity Framework за! и против!
От: IT Россия linq2db.com
Дата: 29.06.14 20:24
Оценка: +2
Здравствуйте, gandjustas, Вы писали:

IT>>Что за проблема с FirstOrDefault?

G>Потому что внутри запроса он преобразуется в select top 1 from (select rownumber() over (...) from t) при некоторых условиях (группировка и еще что-то).

Это такое EF генерит? Жуть.
Если нам не помогут, то мы тоже никого не пощадим.
Re[21]: Entity Framework за! и против!
От: Alexander Polyakov  
Дата: 29.06.14 20:27
Оценка: :)
IT>И как ощущения? Для меня сегодня рефакторинг БД ничем не отличается от обычного рефакторинга кода. Т.е. вообще ничем. Когда же я писал SQL руками, то это был невероятный геморой.
Рефакторинг же не конечная цель. Конечная цель это постепенно строить и развивать приложение. И рассматривать отвлеченные переименование таблицы/колонки не интересно.
Если доступ к базе не покрыт ни тестами, ни статической типизацией, то, да, вносить изменения очень боязно, поэтому это сильно тормозит развитие, а разработчики начинают серьезно играть в игру угадай будущее. Что несомненно плохо. А вот разница между случаем, когда есть тесты, и случаем, когда есть статическая типизация, эта разница уже не такая существенная. Разработчики без проблем вносят изменения в базу, поскольку есть уверенность, что их ошибки отловятся и они не отдадут поломанное приложение в продакшен.
Re[20]: Entity Framework за! и против!
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 29.06.14 20:28
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, gandjustas, Вы писали:


IT>>>EF — это всё же отдельно от всего лежащий кусок кала.

G>>Года два назад отдали в ASP.NET
IT>Т.е. его пилят уже не те индусы, которые завалили WinFS?
В МС результат мало зависит от индусов, они обычно пилят то, что скажут. Результат зависит от менеджеров прогдакт-группы. Сейчас у asp.net похоже самые толковые менеджеры.


IT>>>Ваня правильнос сказал, что практикующим девелоперам ещё лет 10 назад стало понятно каким должно быть средство работы с БД. Но команда EF шла на пролом своим путём.

G>>Если всем понятно, то почему никто не сделал?

IT>Во-первых, написание полноценного Linq-провайдера — это не тривиальная задача типа unit testing framework. Лет пять назад в MS эту задачу оценивали в пару лямов.

Слабая отмазка, в Open Source уже немерено этих провайдеров, а IQToolkit появился вместе с .NET 3.5. Если бы новый провайер мог решить реальные проблемы, а не сущетвующие только в голове отдельных личностей, то уже давно бы это сделали.

IT>Во-вторых, большинство попыток следуют текущей конъюнктуре и в конце концов сваливаются к созданию heavy-ORM.

Какой такой конъюнктуре?

IT>В-третьих, сделали. linq2db не страдает ORM-ностью и представляет собой скорее типизированный SQL.

И что? Проблемы решились? Где толпы восторженных пользователей? Гуглг по linq2db находит репы, NuGet пакеты и целое одно сообщение на rsdn давностью больше полугода.

IT>>>Новый компилятор позволяет переписать устаревший код и сделать его лучше. Но новый компилятор не поможет сделать лучше новую архитектуру.

G>>Да ладно? Например с помощью compiler as service можно сделать compile time генерация маппинга DataReader на объекты как минимум или запросто компилировать в реальный IL edmx-модель, убрав весь оверхед, или делать compile-time проверяемые текстовые запросы с декомпозицией (как мечтает Поляков).

IT>Убрать весь оверхед не получится. То, о чём ты говоришь — это лишь несколько процентов сценариев использования. Но даже маппинг одного и того же объекта может отличаться. Например:


IT>
IT>from t in Table select t;
IT>from t in Table select new { t.Filed1.Length, t };
IT>


IT>Во втором случае индексы для маппинга t съедут на 1 и придётся наворачивать весь оверхед обратно. К тому же это всё не является серьёзной проблемой. linq2db строит expression tree для каждого запроса со всеми необходимыми маппингами без всякого оверхеда в run-time, потом компилирует его и кеширует. Эффективность такого решения примерно как у параноидального ручного маппинга с индексами вместо имён полей.

Верю. И что? Для меня вообще скорость маппинга не была никогда проблемой. При тех нагрузках, где скорость мапинга хоть что-то решает я использую кеширование и на скорость мапинга становится пофиг. Это IB беспокоит скорость мепинга, а по моим замерам ef тратит на мепинг одного объекта на 0,2 мкс (две десятых миросекунды, 2*10^-7 секунд) больше, чем при ручном мепинге (проверял на резалтсете из 5000к элементов). Кстати это составляет примено тысячную часть часть от времени запроса, без чтения с диска.
Я вот даже не могу представить причину по которой меня (или кого либо) должны такие "тормоза" беспокоить.



G>>Возвращаясь к теме EF — начиная с версии 5 активно внедряется такой же сервисный подход. Тоже есть встроенный IoC, тоже куча подменяемых сервисов и соглашения (положительное влияние asp.net). Но под капотом там еще остался старый EF, построенный на принципах ООП, который и хотят в версии 7 выкорчевать из EF.

IT>Честно говоря, мне не очень понятно, что там нужно такого расширяемого в linq-провайдере
Скорее всего в самом Linq провайдере и не будет особой расширяемости по сравнению с предыдущей версией.

Кстати для замеров добавил linq2db в тестовый проект, оказалось что TT генератор хреново работает с базами, у которых точки в имени, а также напрягло что завязано на .config файл. В KRuntime хотят отказаться от идеи обязательного конфига, да и сейчас много сред, где конфиг недоступен.
Re[23]: Entity Framework за! и против!
От: Alexander Polyakov  
Дата: 29.06.14 20:42
Оценка:
IT>Аналогичный код:
IT>https://github.com/linq2db/linq2db/commit/53924cf402916fd181cc552aaf8c8f99ead534ea
IT>Работает шо железная железяка.
У тебя "int ParentID". Nullable ParentID должен быть.
Я же приводил скрипт выше:
INSERT [Account] ([Id], [Field1]) VALUES (N'02298796-255d-4f91-bb7b-bcda8df396cc', 0)
INSERT [Message] ([Id], [AccountId]) VALUES (N'b1c9fbda-577f-4853-a661-c8dc9664ee6f', N'02298796-255d-4f91-bb7b-bcda8df396cc')
INSERT [Message] ([Id], [AccountId]) VALUES (N'd2747cc2-63b7-4fe1-890a-cfd736faf78b', NULL)

P.S. По хорошему, Parent свойство должно быть Option<Parent>.
Re[21]: Entity Framework за! и против!
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 29.06.14 21:00
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Здравствуйте, gandjustas, Вы писали:


G>>Странная логика, любая архитектура — набор ограничений. Заранее ты не знаешь какие цели будут поставлены. То есть в принципе любая архитектура кривая.


НС>Ты вообще не понимаешь, похоже, что тебе пишут. Проблема не в том что архитектура кривая, а в том что изначальные цели и требования были сформулированы неверно. А кривая архитектура — лишь следствие.

НС>Ты внимательно почитай что авторы пишут: "there are many seldom used features and capabilities in the code base". Умные люди еще с ранних бета-версий EF говорили именно об этом (посмотри на LINQ часть BLT или linq2db, там почему то этих мегафич нет). Но понадобилось куча времени и релизов, чтобы до разработчиков EF наконец дошло.

По прядку.

1) "Дошло" до команды EF только тогда, когда понадобилось портировать EF на WinRT (читай "телефоны"). Когда создавался EF никто и представить не мог, что вообще будет WinRT. По большому счету сейчас ни один ORM в телефоне не заработает, так же как EF. Будем считать что у всех архитектура кривая.
2) Куча редкоиспользуемых фич никого не беспокоит (кроме тех, кто активно цитирует пресс-релиз в этой теме).
3) Мега-тормоза, о которых также любят писать некоторые люди в этой теме, тоже мало кто видел. Лично я сталкивался с тормозами EF и решал эту проблему парой строк кода, в текущей версии все эти решения автоматизированы.

Я прекрасно понимаю что тут пишут, и прекрасно понимаю, что это совершенно не проблемы для подавляющего большинства программистов.
Re[22]: Entity Framework за! и против!
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 29.06.14 21:05
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, gandjustas, Вы писали:


IT>>>Что за проблема с FirstOrDefault?

G>>Потому что внутри запроса он преобразуется в select top 1 from (select rownumber() over (...) from t) при некоторых условиях (группировка и еще что-то).

IT>Это такое EF генерит? Жуть.


Помоему это было в Linq2SQL, не помню уже. Там был кейс, что такой SQL, единственный, который давал результат, аналогичный результату на списке объектов. Причем, по странному стечению обстоятельств, таких запросов в коде было дофига.
Re[21]: Entity Framework за! и против!
От: Alexander Polyakov  
Дата: 29.06.14 23:14
Оценка:
НС>Тесты это хорошо, но руками править кучу текстовых запросов вместо решарпера при простейшем переименовании поля или таблицы — это надо быть очень убежденным в своей правоте.
Всякие Фаулеры, проповедующие аджайл, на тесты и уповают, у них и языки часто динамические.
Забавно
Re[20]: Entity Framework за! и против!
От: _Raz_  
Дата: 29.06.14 23:18
Оценка:
Здравствуйте, Alexander Polyakov, Вы писали:

AP>>>Если не сложно опиши, как в таком режиме работать с EF?

IT>>А в чём тут проблема?
AP>Проблем нет. Просто хотел уточнить свое понимание. Тексты классов являются перегенерируемыми, т.е. около полей ничего не пишем руками? (иначе всё снесется) В одном из туториалов видел как вручную навешивались ASP MVC атрибуты, значит, это был неправильный туториал.

Читай про MetadataTypeAttribute
... << RSDN@Home (RF) 1.2.0 alpha 5 rev. 77>>
Re[22]: Entity Framework за! и против!
От: IT Россия linq2db.com
Дата: 30.06.14 01:20
Оценка: +1
Здравствуйте, Alexander Polyakov, Вы писали:

AP>В связи с этим можно у тебя поинтересоваться, на чём у вас UI?


Традиционно WPF и ASP.NET MVC. Т.е. тут даже думать не надо. MVVM и MVC требуют для себя отдельной модели, которая с DataModel пересекаться может, но редко и не долго, ровно до тех пор пока не начнётся усложнение UI. Т.е. для себя я давно решил, что модель данных приложения ака DataModel, необходима исключительно для того, чтобы работать с БД. Кстати, BLT и linq2db поддерживает параноидальный режим описания метаданных БД в виде интерфейсов, а не классов, что вообще искючает создание экземпляров объектов модели данных. Т.е. модель данных используется исключительно для запросов к БД. В целом это работает неплохо, учитывая, что большая часть запросов в реальном приложении представляют собой ad-hoc запросы и требуют перекладывания данных из БД в модель MVVM или MVC.
Если нам не помогут, то мы тоже никого не пощадим.
Re[22]: Entity Framework за! и против!
От: IT Россия linq2db.com
Дата: 30.06.14 01:28
Оценка: +1
Здравствуйте, Alexander Polyakov, Вы писали:

AP> Если доступ к базе не покрыт ни тестами, ни статической типизацией, то, да, вносить изменения очень боязно, поэтому это сильно тормозит развитие, а разработчики начинают серьезно играть в игру угадай будущее.


Юнит тесты — это прежде всего дорого и долго. К тому же наличие статической типизации делает большинство юнит тесов, которые делалются как раз из-за её отсутствия, бессмысленными. Т.е. и здесь linq серьёзно способен удешевить разработку.
Если нам не помогут, то мы тоже никого не пощадим.
Re[21]: Entity Framework за! и против!
От: IT Россия linq2db.com
Дата: 30.06.14 01:52
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>В МС результат мало зависит от индусов, они обычно пилят то, что скажут. Результат зависит от менеджеров прогдакт-группы. Сейчас у asp.net похоже самые толковые менеджеры.


Ну будем надеяться.

IT>>Во-первых, написание полноценного Linq-провайдера — это не тривиальная задача типа unit testing framework. Лет пять назад в MS эту задачу оценивали в пару лямов.

G>Слабая отмазка, в Open Source уже немерено этих провайдеров, а IQToolkit появился вместе с .NET 3.5. Если бы новый провайер мог решить реальные проблемы, а не сущетвующие только в голове отдельных личностей, то уже давно бы это сделали.

Отмазка вполне серьёзная. Тот же IQToolkit более как на роль примера linq-провайдера больше ни на что не тянет. Реально его пытался использовать только автор Subsonic, который в результате на OrmMetter не был допущен к забегу в категории linq из-за фейла почти всех linq-тестов.

В общем, если бы я точно знал куда я лезу, когда начинал заниматься linq-провайдером в BLT, то точно бы не стал этого делать и сейчас, скорее всего восхвалял EF вместе с тобой и точно так же спорил бы с IB

IT>>Во-вторых, большинство попыток следуют текущей конъюнктуре и в конце концов сваливаются к созданию heavy-ORM.

G>Какой такой конъюнктуре?

Все хотят построить не просто маппер, а охренительный умный всемогутер, который сам знает что нужно разработчику ещё до того как разработчик об этом подумал. Тот же Unit Of Work, на самом деле, вполне имеет право на жизнь в некоторых случаях. Но проблема в том, что конъюнктурщики начинают именно с него, а всё остальное в результате идёт по-боку, потому что на это элементарно не хватает ресурсов. Мне, кстати, тоже сильно не хватает ресурсов, в частности на тот же Unit Of Work, но зато мне их хватило на генерацию вменяемого SQL для FirstOrDefault, для поддержки более десятка БД, для генерации human friendly SQL, который не нужно переформатировать, чтобы на него посмотреть и прочих вещей, нужных не для демонстраций, а для каждодневной работы.

IT>>В-третьих, сделали. linq2db не страдает ORM-ностью и представляет собой скорее типизированный SQL.

G>И что? Проблемы решились? Где толпы восторженных пользователей? Гуглг по linq2db находит репы,

Я программист, а не пиарщик. Видимо в этом проблема. К тому же см. выше про ресурсы. Кто-то их тратит на написание кода, а кто-то на толпы восторженных пользователей.

G>NuGet пакеты и


http://www.nuget.org/packages?q=linq2db

G>целое одно сообщение на rsdn давностью больше полугода.


Вообще-то есть целый форум про это дело. К тому же linq2db это как раз переработка BLT в части linq и всё, что касается BLT можно отнести к linq2db.

G>Верю. И что? Для меня вообще скорость маппинга не была никогда проблемой.


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

G>Кстати для замеров добавил linq2db в тестовый проект, оказалось что TT генератор хреново работает с базами, у которых точки в имени,


Давай пофиксим вместо. Давай пример неработающего кода, будем фиксить.

G>а также напрягло что завязано на .config файл. В KRuntime хотят отказаться от идеи обязательного конфига, да и сейчас много сред, где конфиг недоступен.


Всё можно сконфигурировать и без конфигов. Последние пять лет у меня это вообще была единственная доступная опция.
Если нам не помогут, то мы тоже никого не пощадим.
Re[24]: Entity Framework за! и против!
От: IT Россия linq2db.com
Дата: 30.06.14 02:04
Оценка:
Здравствуйте, Alexander Polyakov, Вы писали:

AP>У тебя "int ParentID". Nullable ParentID должен быть.


https://github.com/linq2db/linq2db/commit/c2e3e660c3ffaa7f932772c41088644060b1d6ef

Резултат тот же. Может у тебя не самая свежая версия. Я довно nuget не обновлял. Может в этом проблема.

AP>P.S. По хорошему, Parent свойство должно быть Option<Parent>.


Да это как бы тоже не проблема. Можно покумекать над расширением маппинга для твоего собственного Option<T>.
Если нам не помогут, то мы тоже никого не пощадим.
Re[23]: Entity Framework за! и против!
От: IT Россия linq2db.com
Дата: 30.06.14 02:06
Оценка: +1
Здравствуйте, gandjustas, Вы писали:

G>Помоему это было в Linq2SQL, не помню уже. Там был кейс, что такой SQL, единственный, который давал результат, аналогичный результату на списке объектов. Причем, по странному стечению обстоятельств, таких запросов в коде было дофига.


Ну незнаю, обычного TOP 1 хватает за глаза. Для Single(OrDefault) TOP 2. Но даже это всё не обязательно.
Если нам не помогут, то мы тоже никого не пощадим.
Re[22]: Entity Framework за! и против!
От: Ночной Смотрящий Россия  
Дата: 30.06.14 07:56
Оценка:
Здравствуйте, Alexander Polyakov, Вы писали:

AP>Не забываем, что еще есть FindUsages. FindUsages выдаст список [File, Line]. [File, Line] указывает на начало метода с запросом, а там Ctrl-F.


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