« first day (530 days earlier)      last day (2501 days later) » 

A K
6:03 AM
И я так понимаю, что есть ещё вариант через inverse property как-то сделать (про это говорил Майоров), что-то типа такого: professorweb.ru/my/entity-framework/6/level2/2_2.php
Как-то у меня не складывается именно общий навык -- как решать подобные задачи на достроение связей между таблицами, не вижу я их
В данном примере Code-First не сможет автоматически распознать связь между навигационными свойствами этих классов.
Почему не может?
Согласно соглашениям, Code-First может самостоятельно определить двунаправленную связь между таблицами, только когда существует всего одна пара навигационных свойств.
Как он определяет когда может?
Загадка
Вот аналогичный пример: ru.stackoverflow.com/questions/540009 и тоже непонятна магия как что определеяется
 
A K
6:34 AM
Пожалуй, я бы тоже не отказался от такого: chat.stackexchange.com/transcript/message/34999534#34999534
 
 
4 hours later…
10:44 AM
@AK вы все усложняете :)
 
@PashaPash иии? :-) где развернутый ответ? :)
 
@Grundy это и есть суть ответа :)
 
@PashaPash ну а делать-то что? :)
 
@Grundy предназначение архитектуры ПО - контролировать сложность, а не создавать ее
@Grundy не надо ничего делать. код в моем ответе полностью рабочий. и делает именно то, что хотел @AK
@Grundy EF достаточно топорно работает. Если он видит у E1 свойство с типом E2 - он создает связь многие-к-одному
@Grundy если видит свойство с типом Collection<E2> - то создает связь один-ко многим
 
@PashaPash аааа :-) я думал ты в чате напишешь :-)
 
10:50 AM
@Grundy мне просто некоторые вещи в финальном варианте от @AK кажутся избыточными
например
[Required]
public int CarID { get; set; }
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
это все шум в коде
т.е. реально из добавленного кода там только
public int? PrimaryImageID { get; set; }
а я не люблю шум в коде (
особенно раздражаюсь на проверки someNullableInt.HasValue
хуже только if (someNullableInt.HasValue && someNullableInt.Value = 5)
это как написать if (someBool == true)
 
@PashaPash а что не так с проверкой HasValue? если есть две ветки - на присутствие значения и на отсутствие?
 
@Grundy не так то, что для точно таких же переменных, но типа object принято писать == null
@Grundy someNullable == null
@Grundy т.е. проверять на null Nullable не через == null, а именно вызовом HasValue - странно. зачем тогда заводить nullable?
 
@PashaPash чтобы флаг отдельно не передавать :-)
 
@AK а по теме - "Согласно соглашениям, Code-First может самостоятельно определить двунаправленную связь между таблицами, только когда существует всего одна пара навигационных свойств." - msdn.microsoft.com/en-us/library/jj679962(v=vs.113).aspx
 
а сравнение разве внутри не тот же флаг проверяет?
 
10:58 AM
@Grundy тот же. т.е. в коде if (someNullable.HasValue) и (someNullable == null) - это одно и то же
@Grundy просто очень странно использовать нестандартную проверку на null для какого-то типа только потому, что у него есть какой-то там флаг внутри
 
@PashaPash а ты знал, что у Nullable есть метод GetValueOrDefault()???
 
@Grundy ??
@Grundy да :)
 
Ага, я вот первый раз увидел что он там есть вообще
 
@Grundy но вообще вот if (someNullableInt.HasValue && someNullableInt.Value = 5) - это гораздо хуже
 
@PashaPash эм, а присваивание - это опечатка?
и должно было быть сравнение?
 
11:02 AM
@Grundy да, сравнение
if (someNullableInt.HasValue && someNullableInt.Value == 5)
 
@PashaPash да, вот тут странно
 
@Grundy ну вот я такое регулярно вижу. т.е. просто люди не понимают, как себя null при сравнении поведет, и пишут код "на всякий случай"
11
Q: HasValue and Value

CraigI noticed something in a code review I did, and am wondering if it's suitable. a.EndDate.HasValue && a.EndDate > paymentPeriodEndDate Shouldn’t that be: a.EndDate.HasValue && a.EndDate.Value > paymentPeriodEndDate Note, a.EndDate is a DateTime?, while paymentPeriodEndDate is DateTime Shoul...

вот например
три ответа, и никто не сказал "чувак, напиши просто a.EndDate > paymentPeriodEndDate"
81
Q: Best way to check for nullable bool in a condition expression (if ...)

FireSnakeI was wondering what was the most clean and understandable syntax for doing condition checks on nullable bools. Is the following good or bad coding style? Is there a way to express the condition better/more cleanly? bool? nullableBool = true; if (nullableBool ?? false) { ... } else { ... } e...

> I think a lot of people concentrate on the fact that this value is nullable, and don't think about what they actually want :)
@Grundy причем это повсюду. в книгах:
 
@PashaPash да ну ладно О_О
 
@Grundy if (ReminderType.IsChecked.HasValue && ReminderType.IsChecked.Value)....АААА
 
@PashaPash Ну вот, я только хотел сказать, типа, что от наших ожидать, но тут и иностранные такие же
печаль-беда
 
A K
11:14 AM
@Grundy Ответ действительно правильный и подходящий, это кандидат номер1 на то, чтобы поставить галку (и других не предвидится). Другое дело, что я бы хотел ещё и удочку смастерить, а не только конкретную рыбину поймать. (Вопрос как научиться в общем случае писать код для множественных связей в EF -- это более широкий вопрос и неконкретный.) Но пока глядя на конкретные примеры у меня не "щёлкнуло" в голове, возможно, со временем придёт.
 
A K
@PashaPash Да, я уже смотрел (выше была). И ещё две книжки по EF качнул, почитываю. Мне как раз кажется, что здесь нужна практика. Либо каждую отдельную связь многократно показывать на реальных проектах, пока не выработается навык; либо ER - диаграммы почертить для всех видов связей (за эти две недели выяснилось, что у меня не вся терминология осталась)
 
@AK у меня вот вообще в универе была пересдача по базам данных.
@AK потому что работал, и забил на пары :))
 
A K
Кстати, на русском книг по EF нет в бумаге до сих пор: заходил в книги по c#, ничего не нашёл, поискал в сети -- нету. Плюнул, пошёл буржуев качать. А вот в сети (если не зацикливаться на бумаге) есть несколько сайтов на русском. Но мы в вопрос про книги не можем вписать сайты, только книги -- верно?
 
@AK можно вписывать сайты
@AK только заголовок вопроса подправить на "книги и учебные материалы"
@AK вообще самое худшее с базами данных (и с реляционными моделями) - это то, что всех долго и упорно учат, что данные надо нормализовать. Что 3-я нф добро. А 4-я - вообще идеал
 
A K
11:20 AM
@PashaPash О, неплохо. Тогда я наверное впишу про EF раздел.
@PashaPash Ага, а потом на производстве переучивают, что порой нужно частично денормализовывать и что "избыточность" не всегда зло.
 
@AK а на практике, когда доходишь до реальной работы с данными, понимаешь, что иногда приходится делать денормализацию
@AK да, причем мы вот в основном из-за проблем с производительностью делаем денормализацию
@AK потому что в какой-то момент стало понятно, что SQL Server (и вообще любой SQL) просто не умеет эффективно выполнять некоторые запросы.
 
11:34 AM
@PashaPash какие например?
 
 
3 hours later…
2:18 PM
@Grundy если честно - почти любые
@Grundy это, кстати, одна из проблем. т.е. для дотнетчиков SQL это такой черный ящик. Который вроде как нормально работает.
@Grundy иногда тормозит, и тогда надо типа "расставить индексы"
@Grundy я вот собеседовал пачку людей-фуллстекеров. И картина примерно такая - все знают .net. некоторые хорошо знают JS. но SQL - почти никто не знает. Т.е. обычно знания об SQL останавливаются на LEFT JOIN
@Grundy и когда такой вот средний девелопер натыкается на проблему производительности в SQL - он начинает бить в бубен
 
@PashaPash о, какие еще обычно вопросы? :) я так понимаю только про join и спрашивают в основном :)
 
@Grundy ну это предсказуемо - потому что обычно и собеседующие дальше джойнов не лазили
@Grundy мы вот спрашиваем физические типы джойнов - "как именно SQL Server выбирает данные вот в таком-то запросе".
 
@PashaPash а что значит как именно? :-)
 
@Grundy ок, у вас две таблицы - таски и проекты. у таска есть ProjectID
@Grundy скажем, выбираются таски + имена проектов. как именно SQL Server будет выполнять такой запрос
если он частый - можно ли его ускорить?
что если при этом задачи надо отсортировать по имени проекта?
 
@PashaPash :-D и тут я понял, что не представляю как именно это делает SQL Server :-D
 
2:33 PM
что если надо выбрать только имена задач, даты конца задач, имена проектов, и отсортировать при этом по дате?
 
@PashaPash но всегда ж можно посмотреть план запроса и узнать на что уходить основная работа?
 
@Grundy да. вопрос - что вы будете с этим планом делать
@Grundy и, естественно, будет ли план таким же на продакшене :))
 
@PashaPash ответ очевиден :-) если что-то тормозит - надо добавить индексы :-) помогает в 99% случаев стандартных запросов :)
 
@Grundy какие индексы?
 
@PashaPash сикульсерверные:)
 
2:35 PM
@Grundy ага. так мы ж спрашиваем "как именно"? :)
@Grundy и кстати - это неправильный ответ. индексы не всегда помогают
 
@PashaPash ага, но обычно :)
 
@Grundy т.е. можно создать индекс, SQL Server начнет его использовать при выборке - но результат станет хуже!
 
@PashaPash о, да? :) а можно пример такого?
 
@Grundy да, легко, вот недавно было. у нас есть такая вещь, как WBS
@Grundy грубо говоря, это приоритет задач - 1, 2, 3...
@Grundy который, естественно, не совпадает с ID задачи
@Grundy номера могут быть пропущены
@Grundy нужно написать запрос, который перенумерует задачи как 10, 20, 30,... но уже без пропусков
 
@PashaPash что-то не понял про перенумерует задачи как 10, 20, 30
 
2:39 PM
1, 3, 55, 677, 553 превратит в 10, 20, 30, 40, 50
т.е. у задачи есть поле Priority. Надо его "нормализовать"
и записать обратно в задачу
@Grundy на практике там чуть сложнее запрос
сейчас найду текст
 
@PashaPash то есть просто UPDATE?
 
@Grundy да
@Grundy сможете написать?
 
@PashaPash с msdn я думаю да :-)
 
`WITH orderedTasks AS (
SELECT AccountID, TaskId, WbsNumber, ROW_NUMBER() OVER (partition by accountid ORDER BY WBSNumber, TaskId) AS NewWbsNumber
FROM TT_Tasks
WHERE AccountId = @accountId
)
UPDATE tt
SET WbsNumber = NewWbsNumber*@maxWBSDelta
FROM orderedTasks tt
OPTION ( OPTIMIZE FOR UNKNOWN )`
 
@PashaPash а по соответствию 677 будет 40 или 50?
 
2:43 PM
@Grundy 40
 
@PashaPash а почему? он же приоритет как бы понизит?
 
@Grundy но сохранит порядок
@Grundy это проблема разреживания, на самом деле. т.е. там не 10, 20, 30, а 10000000, 20000000, 30000000
@Grundy ну вобщем вот готовый запрос выше
 
@PashaPash ага :)
 
A K
@Grundy Видимо, ключевые слова: "вытесняющий приоритет". Делаем задачу приоритет номер 1, когда сделаем -- приоритет 2 становится приоритетом 1.
 
@AK это на самом деле WBS а не приоритет
 
A K
2:45 PM
@PashaPash Что за аббревиатура? Взвешенный... статус? ммм... не придумаю ничего
 
@AK Work Breakdown Structure
 
A K
@PashaPash Не, не слышал
 
не суть важно. но вот если нет индексов - то запрос выше бежит по PK, выбирает данные, сортирует, и пишет их обратно в PK
Иерархическая структура работ (ИСР) (англ. Work Breakdown Structure, WBS; иногда Структура декомпозиции работ, СДР) — это иерархическое разбиение всей работы, которую необходимо выполнить для достижения целей проекта, на более мелкие операции и действия до такого уровня, на котором способы выполнения этих действий вполне ясны и соответствующие работы могут быть оценены и спланированы. Она включает также определение промежуточных результатов всех составляющих эту структуру работ. == Основные термины и определения == Work (Работа) — непрерывное физическое или умственное усилие, направленное...
@Grundy и тут девелопер такой АГА! я сделаю POC индекс по WBSNumber, TaskId
и данные под выборку будут сразу отсортированы!
 
@PashaPash вероятно проблема в partition?
 
@Grundy да, под partition делаются POC - индексы
Partition, Order, Cover
@Grundy а фокус в том, что теперь SQL Server побежит по индексу. А потом побежит по PK, потому что ему надо найти таски для обновления. А потом будет писать в PK
а потом еще и индекс будет обновлять!
@Grundy т.е. индекс добавили, он подхватился, но теперь у вас в два раза больше чтения и в два раза больше записи
 
2:49 PM
@PashaPash забавно, но про изменение PK Не понял. PK - это primary key ведь?
 
@Grundy и CPU столько же отъедает, т.к. используется или hash join, или сортировка в памяти
@Grundy PK - это кластерный индекс
@Grundy чтобы изменить запись - SQL Server должен найти ее по PK в кластерном индексе
 
@PashaPash а почему тогда PK? :)
@PashaPash только так?
 
@Grundy сократил
@Grundy да
 
@PashaPash а разве не CI какой-нибудь будет сокращением? :)
 
@Grundy потому что значение в кластерном индексе - это и есть сама запись
@Grundy CI уже занят :))
@Grundy мы на конторе раз в год устраиваем мини-ликбез по SQL
 
2:52 PM
@PashaPash а у нас им занимается специально обученный человек :) Но он если уж шарит - то шарит :)
 
@Grundy не ради того, чтобы все умели оптимизировать. просто ради того, чтобы люди перестали думать что SQL - это черный ящик
 
@PashaPash с другой стороны - если близко к этому sql не подходишь - особо и не надо :)
 
@Grundy ну вы же данные через SQL выбираете. вдруг вы геренируете неэффективные запросы?
@Grundy хотя, если у вас энтерпразй или аутсорс - то там обычно забивают. Чинят только если все совсем плохо
 
@PashaPash если использовать Storage Proc - то в принципе ее реализация не особо волнует:)
 
@Grundy SP не решает всех проблем
@Grundy например, SP дает оверхед по вытягиваемым данным. вы же не будете писать SP под каждый набор колонок?
@Grundy "надо вытянуть имена задач? не проблема - тянем все, вместе с описаниями!"
 
2:56 PM
@PashaPash да, именно так!
 
@Grundy а потом бац - а описание у пары задач по два мегабайта
@Grundy клиент туда впейстил войну и мир
 
@PashaPash с этим проще :-) нечего позволять впейстивать войну и мир :)
 
@Grundy это плохая цепочка. разработчики не знали SQL -----> у пользователя тормозит выборка списка задач для внесения времени потому что кто-то (не он!) впейстил куда-то пару мегабайт
 
@PashaPash может быть :-) но пока не сталкивался с такими проблемами :)
 
@Grundy я вот тоже первые 5-6 лет разработки думал что не сталкивался. потом понял, что сталкивался, пользователи страдали, но этого никто не замечал
 
3:02 PM
@PashaPash так страдали или никто не замечал? :-)
 
@Grundy ну были жалобы "система тормозит"
@Grundy клиенты из-за этого уходили
@Grundy сейчас начали приходить. у нас специфическая аудитория - не IT совсем
@Grundy т.е. вам система не понравится. но вот всякий маркетинг - берет за милую душу
 
@PashaPash ага, я помню ты что-то про нее рассказывал :)
 
@Grundy да, пытаемся из старого asp.net приложения слепить современную софтину
@Grundy с переменным успехом
@Grundy зато у нас весело
@Grundy кстати эта вот задача про WBS выше - это ради дрангдропа на канбане. по вертикали
@Grundy ради того, чтобы можно было переставить 100-й таск на 2-е место, не обновляя при этом всю таблицу
 
@PashaPash а разве не вся обновится? вся кроме первой строки?
ну или я не понял про какое обновление идет речь
 
A K
@PashaPash Добавил раздел по EF, несложно посмотреть-проверить, всё ли в порядке?
110
A: Книги по C# и другая литература

VladDЛитература по языку C# Книги для новичков: а о чём это вообще? Head First C#, Jennifer Greene, Andrew Stellman (русский перевод: Изучаем C#, Д. Грин, Э. Стиллмен). Содержит упражнения. Рекомендуется многими как хорошая книга для новичков. C# 6.0 and the .NET 4.6 Framework (7th Edition), Andrew...

 
3:28 PM
@Grundy нет, т.к между значениями приоритетов есть дырки - мы можем не обновлять большую часть строк
@Grundy т.е. есть последовательность задач с приоритетами 10(a) 20(b) 30(c) 40(d) 50(e)
 
@PashaPash ааа, ну то есть этот UPDATE который выше не при переносе выполняется, да?
 
@Grundy да, этот апдейт выполняется когда из-за таких перестановок будут конфликты
 
@PashaPash ага :) тогда понятно :)
 
т.е. когда "дырки" между задачами становяться слишком маленькими - мы из просто разреживаем
@Grundy вобщем, у нас тут весело :)
 
@PashaPash :)
 

« first day (530 days earlier)      last day (2501 days later) »