Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
0 / 0 / 0
Регистрация: 25.04.2020
Сообщений: 136

Проблемы использования EF в реальных приложениях

23.11.2021, 01:22. Показов 2944. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Тема выделена из: https://www.cyberforum.ru/ado-... 06142.html

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Что такое "корректно"?
Если с точки зрения "Будет компилироваться" - да.
Компилироваться то будет, но насколько правильно это использовано. Я привел выше пример, в котором у нас Post должен обязательно ссылаться на Blog.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
// #1
public class Blog
{
    ...
    public List<Post> Posts { get; set; } = null!;
}
 
public class Post
{
    ...
    public int BlogForeignKey { get; set; }
    public Blog Blog { get; set; } = null!;
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
// #2
public class Blog
{
    ...
    public List<Post>? Posts { get; set; } // может быть null - необходимо использовать .Include(p => p.Posts)
}
 
public class Post
{
    ...
    public int BlogForeignKey { get; set; }
    public Blog? Blog { get; set; }; // может быть null - необходимо использовать .Include(p => p.Blog)
}
И вот какой вариант наиболее "корректен" с точки зрения использования нововведений (вопросиков и восклицательных знаков)?) Или нововведения плохо ложатся на использование с EF?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.11.2021, 01:22
Ответы с готовыми решениями:

Как ограничить использования оперативной памяти в приложениях
Собственно некоторые приложения после их использования с 500мб разбухают до 2 гигов, это 32-битное приложение, есть ли утилиты или что-то в...

Сериализация кнопок для использования в других приложениях
Доброго времени суток уважаемые форумчане! Перейду сразу к делу. Решил написать программу (по идее не сложную) Имеется скажем 10...

Намертво зависает компьютер в любых приложениях, после 5-15 мин использования компьютера.
Конфигурация: Мат.плата: MSI P4M890M-L/IL Процессор: Intel Core 2 Duo E6300 Память: 1Gb Samsung DDR-II Жесткий диск:...

30
Эксперт .NET
 Аватар для Usaga
14371 / 9477 / 1360
Регистрация: 21.01.2016
Сообщений: 35,749
26.11.2021, 12:29
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Мне интересна область WPF, но задачи "чисто для WPF" очень редки.
Фронтэндер Вы) Это не плохо, просто такое бывает.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Проблема известная, как-то там надо настраивать саму БД,
Но как это сделать с code-first....?
Это уже проблема Collation (правил сортировки и сравнения строк) в самой базе. EF к этому отношения не имеет. Тут базе нужно ткнуть какие кодировки и collation использовать.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Ненормальность (для меня) в том, что происходит дублирование информации.
Нет. Само дублирование иногда необходимо. Иногда и колонки заводят и отдельные Summary Table (сводные таблицы). Но мне кажется, что именно в данной ситуации такое не нужно. Скорее всего, можно выкрутиться используя Full Text Search.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
С этого и начались мои поиски и эксперименты.
Они у вас начались не с той стороны. Надо было попробовать руками запрос выполнить с кириллицией. EF и провайдеры ADO.NET вряд ли тут что-то меняют. Это на стороне СУБД доджно решаться.
2
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16158 / 11278 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
26.11.2021, 12:47
Цитата Сообщение от Usaga Посмотреть сообщение
Тут базе нужно ткнуть какие кодировки и collation использовать.
Да.
Там именно чё-то с кодировками связанно.
В Шарпе у нас char с юникодом (16-бит).
А SQLite сохраняет всё в байтовой кодировке.
Где-то там, чё-то не то происходит.

Цель ещё стояла, чтобы БД сама инициализировалась при запуске приложения на другом компе или другим пользователем.
Поэтому всё это ещё нужно делать с реализацией через code-first, чего у SQLite, вообще, нет и приходится подключать сторонний пакет от "одиночки".
И пакет этот ещё (возможно) не все фичи code-first поддерживает.

Цитата Сообщение от Usaga Посмотреть сообщение
Фронтэндер Вы
Скорее да, но... не сам дизайн, а логика GUI.
И когда-то, наверное, надоест и что-то другое начну изучать.

Цитата Сообщение от Usaga Посмотреть сообщение
Они у вас начались не с той стороны. Надо было попробовать руками запрос выполнить с кириллицией
Вполне возможно.
Но шёл по пути "наименьшего сопротивления", да и задача по мере реализации изменялась.
Вернее не изменялась, а началось с того, что обратились за помощью с WPF GUI.
Начал править, а там костыли полезли из VM.
Пришлось лезть в VM, а там, вообще, чёрт ногу сломит.
Вернее даже не VM, а Code Behind - в VM я уже сам выделил.
Ну, и как-то так дошло до того, что пришлось полностью от БД всё менять.
1
Эксперт .NET
 Аватар для Usaga
14371 / 9477 / 1360
Регистрация: 21.01.2016
Сообщений: 35,749
26.11.2021, 12:53
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Цель ещё стояла, чтобы БД сама инициализировалась при запуске приложения на другом компе или другим пользователем.
Для этого code first не нужен. Просто берёте пустую (но готовую) базу и поставляете вместе с приложением. Когда нужно "инициировать" новую базу, то просто копируете из ресурсов (или как вы её поставите с приложением) в папку назначения. Обычное решение.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Но шёл по пути "наименьшего сопротивления", да задача по мере реализации изменялась.
Ну, конкретно в такой ситуации стоит посмотреть сразу на самый нижний уровень - на базу. Умеет ли она так как вам надо и что нужно, чтобы включить это, если умеет. А просто менять провайдеры ADO.NET и EF'а это уже тасование наугад. Это путь наибольшего сопротивления. Как bogosort. Результа-то вы получите, но когда?
2
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16158 / 11278 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
26.11.2021, 13:01
Цитата Сообщение от Usaga Посмотреть сообщение
Для этого code first не нужен. Просто берёте пустую (но готовую) базу и поставляете вместе с приложением. Когда нужно "инициировать" новую базу, то просто копируете из ресурсов (или как вы её поставите с приложением) в папку назначения. Обычное решение.
Да, такое тоже использую.
Но в данном случае пришлось бы объяснять, что при изменении DbContext нужно пересоздать БД согласно его схеме и как правильно перезаписать её.
И учить тому, что сам не очень знаю, да, ещё и тех кому это по сути и не надо....
В общем, решение с code-first гораздо проще оказалось в использовании и поддержке (которую осуществляю не я).

Цитата Сообщение от Usaga Посмотреть сообщение
Ну, конкретно в такой ситуации стоит посмотреть сразу на самый нижний уровень - на базу.
Соласен.
С WPF так и поступаю.
Но БД для меня это новая или забытая область знаний.
И чтобы посмотреть "внизу" мне надо сначала изучить как туда надо смотреть.
1
Эксперт .NET
 Аватар для Usaga
14371 / 9477 / 1360
Регистрация: 21.01.2016
Сообщений: 35,749
26.11.2021, 13:06
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Но в данном случае пришлось бы объяснять что при изменении DbContext нужно пересоздать БД согласно его схеме и перезаписать его.
Не обязательно. Решения тут разные могут быть. Тот же code first, миграции (EF Core), Liqeubase или просто SQL-скрипт. Это не отменяет того, что базу исходную можно с приложением поставлять. Мы так и делаем. Кастомерам ставится исходная база, а потом скриптом миграции доводится до актуальной версии. Меняется версия программы, с ней новый скрипт актуализирует базу.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
И чтобы посмотреть "внизу" мне надо сначала изучить как туда надо смотреть.
Через SQLiteBrowser. DBeaver вроде бы тоже умеет. Там же и саму базу можно сварганить.
2
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16158 / 11278 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
26.11.2021, 13:12
Цитата Сообщение от Usaga Посмотреть сообщение
Через SQLiteBrowser.
Ну, это я смотрел.
Там просто тип поля TEXT и вся инфа.
А о причинах проблем с регистронезависимым поиском, что он может сообщить?
1
Эксперт .NET
 Аватар для Usaga
14371 / 9477 / 1360
Регистрация: 21.01.2016
Сообщений: 35,749
26.11.2021, 13:17
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Там просто тип поля TEXT и вся инфа.
Может быть в схеме таблицы может быть видна кодировка этого поля.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
А о причинах проблем с регистронезависимым поиском, что он может сообщить?
Абсолютно ничего) С его помощью вы может посмотреть схему базы. Может запросы повыполнять. Тот же LIKE с кириллицией и посмотреть как оно работает. Если работает. Хотя бы убедиться, что на уровне базе это работает. Тогда круг подозреваемых сузится до ADO.NET и EF. Скорее до ADO.NET и какого-то параметра в строке подключения. Так как EF на кодировки уже не влияет.
2
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16158 / 11278 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
26.11.2021, 13:29
Цитата Сообщение от Usaga Посмотреть сообщение
. Может запросы повыполнять. Тот же LIKE с кириллицией и посмотреть как оно работает.
Я думал это только средство просмотра.
Попробую.
1
Эксперт .NET
 Аватар для Usaga
14371 / 9477 / 1360
Регистрация: 21.01.2016
Сообщений: 35,749
26.11.2021, 13:30
Элд Хасп, ну так выполнение запросов к базе вполне к средствам просмотра относится)
2
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
26.11.2021, 13:57
Вставлю свои 3 коп, если позволите
Часто текстовый поиск не работает вовсе не по причине латиницы/кириллицы, а от их "жгучей смеси", когда юзер ошибочно ввел букву не на той раскладке и не заметил этого из-за одинаковости отображения. Например, в фамилии Смирнов первую букву он ввел на латинице да так и сохранил (выглядит буква "С" одинаково и кнопка на клаве одна и та же для обеих раскладок) . Естественно, теперь поиск Like Смирнова не найдет. И проверить всю базу на такие вот ляпусы непросто - приходится писать программу, которая перебирала бы всю колонку в таблице на предмет "коктейля".
Приходилось не раз сталкиваться с подобным. Таблетка есть - писать в триггере проверку всех символов на правильность раскладки. Сколько в базе подобных полей, столько должно быть и "таблеток".
Есть еще вариант, но он будет серьезно тормозить выполнение запросов - использовать UDF для преобразования строк к указанной раскладке. Но зато не нужно периодически "шерстить" всю базу.

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

Добавлено через 9 минут
Но есть тяжелые случаи, когда в названии или маркировке используются разные языки. Тут уж ничего не поделаешь, и триггеры не спасут, и программка-"гребенка" не поможет - разве что обнаружит и покажет потенциальные косяки, которых может быть десятки, а то и сотни тысяч, - вот и разбирайся
Приходится полагаться только на добросовестность людей при наборе данных.

Мне приходилось встречать БД, в которых такие сущности разделялись на латиницу и кириллицу в разные колонки, а то и таблицы, но это уже другая история.
2
Эксперт .NET
 Аватар для Usaga
14371 / 9477 / 1360
Регистрация: 21.01.2016
Сообщений: 35,749
26.11.2021, 14:04
MsGuns, что-то я сомневаюсь, что такое нужно отлавливать без явного требования со стороны клиента. Да и не всегда возможно. Это тот случай, когда клиент ССЗБ.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.11.2021, 14:04

Проблемы с изображениями в мобильных приложениях
Здравствуйте! При загрузке моего сайта на мобильном телефоне через Опера-мини все картинки, которые я использую для оформления не...

Целесообразность использования свойств вместо public полей в приложениях, где важна скорость
Visual Studio в том коде, который я пишу для решения одной числодробильной задачи, упорно подсказывал мне о необходимости заменять поля...

Проблемы использования FOR
Решил создать общую тему по вопросам использования FOR, но если так не принято, прошу модераторов переименовать тему. Есть такая...

Назовите проблемы использования RTTI
У меня есть вопрос Назовите проблемы использования RTTI.

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
Новые блоги и статьи
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
Более приземисто - Эстафету хвоста в .cdl (деревья эстафеты в сад).
Hrethgir 25.07.2026
В будущем, после написания блока инверсии обхода дерева (эстафеты хвоста), я планирую вернуться к нашему прошлому разговору о том, обладают ли знания целеполаганием. Тогда я пришел к выводу, что. . .
Вот представьте что вам дали бессмертие.
kumehtar 24.07.2026
Вот представьте что вам дали бессмертие, ничего более не меняя. Вообще ничего, только бессмертие в нынешнем виде. Рады были бы? Что бы вы тут делали всё это время? Никакой пенсии. Никакого нового. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru