Форум программистов, компьютерный форум, киберфорум
C#: ASP.NET Core
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.66/111: Рейтинг темы: голосов - 111, средняя оценка - 4.66
9 / 6 / 3
Регистрация: 10.01.2020
Сообщений: 330

Архитектура построения БД linq2db

06.01.2021, 08:43. Показов 25398. Ответов 111

Студворк — интернет-сервис помощи студентам
Добрый день!

У меня вот такая задача.
Нужно создать БД CodeFirst на linq2db. (99% что это linq2db).

Эту базу будет использовать более 10 мелких приложений.

Как сделать правильно, чтобы методы выборки, создания таблици и т.д. были не конкретно в каждом приложении, а вынесены в стороннюю библиотеку?
Чтобы при изменении таблицы или выборки, не приходилось менять это во всех 10 приложениях, а только в одном месте.

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

Где посмотреть уже готовые решения на основе linq2db?
Не пример использования запросов из справки linq2db, а именно реальную архитектуру построения модели и контроллера.

Буду очень благодарен за любую помощь!
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.01.2021, 08:43
Ответы с готовыми решениями:

В указанном dsn архитектура драйвера и архитектура приложения не соответствуют друг другу
Добрый день. При запуске программы выскакивает вот такая вот ошибка. В чем может быть проблема и как ее исправить?

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

Как ускорить запрос Linq2db?
Всем привет) Использую linq2db для запросов в базу данных. Данных не много. Но очень долго работает. Не подскажете как оптимизировать...

111
Эксперт .NET
 Аватар для Usaga
14347 / 9441 / 1358
Регистрация: 21.01.2016
Сообщений: 35,582
22.01.2021, 09:34
Студворк — интернет-сервис помощи студентам
BeginnerCoderCS, да, верно. Иначе никак.
1
9 / 6 / 3
Регистрация: 10.01.2020
Сообщений: 330
22.01.2021, 10:06  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
да, верно. Иначе никак.
Допустим у нас есть таблица с sql запросами создания других таблиц

И у нас была таблица `table1` с уникальным индексом поля `Name` который создаётся на апдейте 5.
А через 20 апдейтов, мы удалили этот индекс.

То есть при проверке на 5 шаге будет попытка создания индекса, хотя на 25 шаге он (индекс) опять удалится?
Или как в этих случаях быть?

Или таблица с sql запросами других таблиц, тоже постоянно изменяется? а не только дополняется?
0
Эксперт .NET
 Аватар для Usaga
14347 / 9441 / 1358
Регистрация: 21.01.2016
Сообщений: 35,582
22.01.2021, 10:25
Цитата Сообщение от BeginnerCoderCS Посмотреть сообщение
Допустим у нас есть таблица с sql запросами создания других таблиц
Никаких запросов в таблице. Зачем?

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

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

Добавлено через 16 минут
Ну или вместо названия может быть просто номер версии базы. Или дата релиза. Тут уж как вам удобнее.
1
9 / 6 / 3
Регистрация: 10.01.2020
Сообщений: 330
22.01.2021, 10:55  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
В таблице сохраняем названия операций над базой.
Цитата Сообщение от Usaga Посмотреть сообщение
Т.е. мы храним в этой таблице историю изменений.
если ни запросы, то что это значит?
0
Эксперт .NET
 Аватар для Usaga
14347 / 9441 / 1358
Регистрация: 21.01.2016
Сообщений: 35,582
22.01.2021, 10:56
BeginnerCoderCS, блин) Храним название операции. Строку. С текстом. Не SQL-запрос.
0
Эксперт .NET
 Аватар для Usaga
14347 / 9441 / 1358
Регистрация: 21.01.2016
Сообщений: 35,582
22.01.2021, 11:00
Лучший ответ Сообщение было отмечено BeginnerCoderCS как решение

Решение

Вот пример из нашей базы:



И каждый скрипт выглядит так:
1
9 / 6 / 3
Регистрация: 10.01.2020
Сообщений: 330
26.01.2021, 08:56  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Вот пример из нашей базы:
Понасоздавал костылей, а потом нашёл 2 библиотеки для миграций: FluentMigrator и DotNetProjects.Migrator

FluentMigrator в примерах только 3 версия, а в ней зависимостей просто ужас.
А со второй (v2.0.7) что-то не нахожу примеров, чтобы запускать ни с бат файла, а из кода ((

А DotNetProjects.Migrator почему-то так мало установок в Nuget что страшно в продакшн ставить.
0
Эксперт .NET
 Аватар для Usaga
14347 / 9441 / 1358
Регистрация: 21.01.2016
Сообщений: 35,582
26.01.2021, 08:57
BeginnerCoderCS, зачем вам эти библиотеки? Ожидаете, что они за вас всё сами сделают?)
0
9 / 6 / 3
Регистрация: 10.01.2020
Сообщений: 330
26.01.2021, 09:02  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
зачем вам эти библиотеки? Ожидаете, что они за вас всё сами сделают?)
ну да ))
Хочется положиться на опыт других разработчиков. Ну и не изобретать велосипед.
Подход не верен?
0
Эксперт .NET
 Аватар для Usaga
14347 / 9441 / 1358
Регистрация: 21.01.2016
Сообщений: 35,582
26.01.2021, 09:06
BeginnerCoderCS, если хотите, то попробуйте прикрутить эти библиотеки. Я в них смысла не вижу вообще никакого.
0
9 / 6 / 3
Регистрация: 10.01.2020
Сообщений: 330
09.02.2021, 22:18  [ТС]
Доброго всем!!!
Вопрос всё так же касается архитектуры linq2db так что не буду создавать новую ветку.

Тут вот такое дело.
Чтобы пользоваться полноценным enum mysql. То есть чтобы тип enum был и в базе MySQL и в коде C#.
Нужно в enum C# добавлять атрибуты [MapValue(Value = "значение")]

C#
1
2
3
4
5
6
7
8
9
10
   
public enum EntityType
{
    [MapValue(Value = "Unknown")]
    Unknown,
    [MapValue(Value = "TypeA")]
    TypeA,
    [MapValue(Value = "TypeB")]
    TypeB,
}
Если не использовать, то добавляется просто число 0, 1, 2 и в MySQL ошибка так как она ждёт значение.

Так вот в чём вопрос.

Основная масса enum-ов у меня уже есть в модели JSON API сервиса.

Не очень хочется дублировать эти enum-ы из модели JOSN в модель DataBase.

Не будет ли конфликтов, если я добавлю в модель JSON (Newtonsoft.Json) нужные мне атрибуты для linq2db, при условии что там могут быть атрибуты от самого (Newtonsoft.Json).

Допустим почти все enum-ы json у меня с атрибутом
C#
1
[JsonConverter(typeof(StringEnumConverter))]
Может ли компилятор не правильно в каких-то случаях это понять?

Так же с радостью посмотрю другие варианты использования.

Добавлено через 2 часа 32 минуты
Может быть есть возможность не указывать [MapValue(Value = "Unknown")] в enum-ах, а прописать это в свойство?
C#
1
2
3
4
5
6
7
8
public class Table1
{
    [PrimaryKey, Identity]
    public int Id { get; set; }
 
    [Column, MapValue("Что-то прописать здесь, чтобы не писать в самих enum-ах")]
    public EntityType Type { get; set; }
}
0
Эксперт .NET
 Аватар для Usaga
14347 / 9441 / 1358
Регистрация: 21.01.2016
Сообщений: 35,582
10.02.2021, 04:47
BeginnerCoderCS, enum'ы не обязательно должны проецироваться на enum'ы в СУБД. Можно в базе использовать обычный CHECK CONSTRAINT или даже внешний ключ на таблицу статического справочника. Тогда в enum'e в коде никакие атрибуты не будут нужны.
0
9 / 6 / 3
Регистрация: 10.01.2020
Сообщений: 330
10.02.2021, 08:19  [ТС]
Usaga, с внешним ключом при добавлении добавляет запросы.
На примере City.
Нужно добавить строку в City.
Но чтобы добавить нужно получить CountryId, а чтобы получить CountryId, нужно проверить есть ли вообще такой CountryName в таблице, и если нету, то добавить, и только потом получить CountryId.

Вот я и подумал, почему бы не использовать enum-ы которые уже есть.
Это уменьшит количество запросов к БД (особенно при INSERT), ну и сам enum в MySQL хранит 1байт.

Я не пытаюсь всё перевести на enum-ы но есть enum-ы в которых 4 фиксированных значения, и пятое вряд ли когда появится. Зачем отдельная таблица для этого?
0
Эксперт .NET
 Аватар для Usaga
14347 / 9441 / 1358
Регистрация: 21.01.2016
Сообщений: 35,582
10.02.2021, 08:27
Цитата Сообщение от BeginnerCoderCS Посмотреть сообщение
с внешним ключом при добавлении добавляет запросы.
Никто ничего не добавляет. Enum'ы проецируются на статические справочники один в один. Вы все их значения знаете заранее в коде и ничего отдельно добавлять в таблицу не нужно.

Добавлено через 2 минуты
Цитата Сообщение от BeginnerCoderCS Посмотреть сообщение
Зачем отдельная таблица для этого?
Это один из возможных приёмов для организации enum'ов в СУБД. Не нравится такое решение - используйте CHECK CONSTRAINT. Или просто числовое поле.
0
9 / 6 / 3
Регистрация: 10.01.2020
Сообщений: 330
10.02.2021, 08:46  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Никто ничего не добавляет.
Я же выше описал

Цитата Сообщение от BeginnerCoderCS Посмотреть сообщение
Нужно добавить строку в City.
Но чтобы добавить нужно получить CountryId, а чтобы получить CountryId, нужно проверить есть ли вообще такой CountryName в таблице, и если нету, то добавить, и только потом получить CountryId.
Вот так с enum-ом
SQL
1
INSERT INTO city (Id, Name, Country) VALUES (1, 'Моква', 'Россия');
А вот так с внешней таблицей.
Нужно получить CountryId
SQL
1
SELECT Id FROM country WHERE Name = 'Россия';
И если его нет, то добавить его и получить last_id или опять select-ом
SQL
1
2
INSERT INTO country (Id, Name) VALUES (1, 'Россия');
SELECT Id FROM country WHERE Name = 'Россия';
И только потом
SQL
1
INSERT INTO city (Id, Name, CountryId) VALUES (1, 'Моква', 1);
1 запрос VS 4
С enum-ом всё проще, и выборки, и insert-ы.

Или что я опять упускаю?
Есть возможность как-то проще работать с внешними ключами?
0
Эксперт .NET
 Аватар для Usaga
14347 / 9441 / 1358
Регистрация: 21.01.2016
Сообщений: 35,582
10.02.2021, 08:50
Цитата Сообщение от BeginnerCoderCS Посмотреть сообщение
Вот так с enum-ом
Что и где тут является enum'ом?
0
9 / 6 / 3
Регистрация: 10.01.2020
Сообщений: 330
10.02.2021, 08:52  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Что и где тут является enum'ом?
Country
0
Эксперт .NET
 Аватар для Usaga
14347 / 9441 / 1358
Регистрация: 21.01.2016
Сообщений: 35,582
10.02.2021, 08:57
BeginnerCoderCS, я понял. Чтобы мой совет работал (с внешним ключом) вам нужно завести в базе таблицу статического справочника стран. В этом справочнике ID записей будет соответствовать значению перечисления в коде. Тогда никуда за ID страны лезть не нужно будет, ибо вы все ID стран знать будете в коде.

Второй вариант - просто целочисленное поле CountryId, без ограничения ключа. Или с ограничением вида CHECK CONSTRAINT.

Вариант с трансляцией значений enum'а в строки нарушает нормальную форму данных в базе и очень нежелателен.
0
9 / 6 / 3
Регистрация: 10.01.2020
Сообщений: 330
10.02.2021, 09:38  [ТС]
Usaga, то есть вы предлагаете отказаться от использования enum в MySQL вообще?

Представим что нам нужно всего 3 страны. Может быть когда-то понадобятся остальные, а может и нет. Но сейчас их 3.
Вместо вот этого
SQL
1
2
3
4
5
6
CREATE TABLE `city` (
    `Id` INT(11) NOT NULL AUTO_INCREMENT,
    `Name` VARCHAR(255),
    `Country` ENUM('Россия','Украина','Казахстан') NOT NULL DEFAULT 'Россия',
    PRIMARY KEY (`Id`)
);
Нужно делать вот так
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TABLE `country` (
    `Id` INT(11) NOT NULL AUTO_INCREMENT,
    `Name` VARCHAR(100) NOT NULL,
    PRIMARY KEY (`Id`)
);
 
CREATE TABLE `city` (
    `Id` INT(11) NOT NULL AUTO_INCREMENT,
    `Name` VARCHAR(100) NOT NULL,
    `CountryId` INT(11) NOT NULL,
    PRIMARY KEY (`Id`),
    CONSTRAINT `FK_City_CountryId` FOREIGN KEY (`CountryId`) REFERENCES `country` (`Id`) ON UPDATE CASCADE ON DELETE CASCADE
);
И добавить enum (Country) который у меня в C# согласно значений в таблицу country?

Честно скажу, что-то я не пойму, чем плох enum в базе?
Почему ним не пользоваться? Тем более, что наглядно в таблице видим не ссылку а само значение.
0
Эксперт .NET
 Аватар для Usaga
14347 / 9441 / 1358
Регистрация: 21.01.2016
Сообщений: 35,582
10.02.2021, 09:51
Цитата Сообщение от BeginnerCoderCS Посмотреть сообщение
Почему ним не пользоваться? Тем более, что наглядно в таблице видим не ссылку а само значение.
Это галимая денормализация. Я предлагаю не хранить в базе 100500 копий названий стран, а применить один из озвученных выше вариантов. Самый простой способ, который не потребует новых таблиц и аннотирования enum'ов - просто целочисленное поле. Можно даже без CHECK CONSTRAINT.

Ваша исходная проблема какая была? В том, что нужно аннотировать все перечисления, чтобы они на строки (и обратно) проецировались в таблице. Я озвучил варианты решения проблемы, более корректные. Вы вольны не прислушиваться к этому.

Если вы всё равно руками в СУБД названия стран прописываете, то почему бы тогда не завести статический справочник? Это снимет необходимость как в аннотировании enum'ов так и нормализует данные в базе. И никаких дополнительных запросов для определения страны не понадобится, ибо значения (числовые) enum'ов есть ID соответствующих записей в таблице стран.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.02.2021, 09:51
Помогаю со студенческими работами здесь

Linq2db как изменить имя таблицы?
При описании класса таблицы атрибутом указывается имя таблицы. Например: //Здесь указывается имя таблицы public partial...

Запрос linq2db c условием разницы времени
Здравсвуйте) Испльзую орм linq2db. И у меня такой запрос: найти заказы которые выполнялись более одного дня orders = (from s in orders...

Как мне понастроить linq2db в .NET Core?
Зашёл в документацию по подключению к базе данных. Это сделал. public class ConnectionStringSettings : IConnectionStringSettings { ...

Как сохранить изменения сделанные в DataGridView в БД при использовании linq2db?
Заполнить dataGridView у меня получилось: using (DBSystem dbSystem = new DBSystem()) { bindingSource1.DataSource =...

linq2db.mysql - No PK is defined or all fields are keys при обновлении строки из формы
Приветствую Всех форумчан!!! Пытаюсь разобраться с linq2db, не могу понять следующее. есть вот такая табличка: CREATE TABLE...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
Модель здравосохранения 17. Планы на выгорание
anaschu 23.05.2026
Вот конкретная схема реализации: В классе Работник добавить: накопленнаяУсталость — растёт каждый час работы, снижается в перерывы и болезни коэффициентПрезентеизма — снижает продуктивность. . .
Изменение цветов в палитре gif файла aka фавикона
russiannick 23.05.2026
Изменение цветов в палитре gif файла, юзаемого как фавиконка в составе html-файла, помещенная в base64, средствами нативного Java Script, навеянное сном в майский день. Для работы необходим браузер,. . .
Модель здравосохранения 16. Слишком хорошие и здоровые сотрудники уходят, недовольные зарплатой
anaschu 23.05.2026
Отладка увольнений и настройка производительности Сегодня во второй половине дня разобрались с механикой увольнений и настроили коэффициент сложности заданий. Вот что было сделано. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru