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

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

06.01.2021, 08:43. Показов 25655. Ответов 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
9 / 6 / 3
Регистрация: 10.01.2020
Сообщений: 330
09.01.2021, 10:50  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Usaga Посмотреть сообщение
Возможность выгружать записи из связанных таблиц
Спасибо. С выгрузкой разобрался.
Добавил связь и в Country

C#
1
2
3
4
5
6
7
8
9
10
11
public class Country
{
    [PrimaryKey, Identity]
    public int Id { get; set; }
 
    [Column]
    public string Name { get; set; }
 
    [Association(ThisKey = nameof(Id), OtherKey = nameof(City.CountryId))]
    public IList<City> Cities { get; set; }
}


А linq2db может добавлять вот такую запись?
Хочу я добавить `Город` в `City` по стране `СтарныНет` которой ещё нет в таблице `Country`?

Что-то типа
C#
1
2
3
4
5
6
7
var city = new City
{
    Name = "Город",
    CountryId = // Получить Id страны "СтарныНет" из Country или добавить её в Country и вернуть добавленный Id
};
 
db.Insert<City>(city);

Или как лучше такое добавление производить? Чтобы не отдельным запросом к Country с проверкой.


Цитата Сообщение от Usaga Посмотреть сообщение
Вообще, создаётся. При определении таблицы (CREATE TABLE) и все его констрейнты можно определить не отходя от кассы.
То есть можно создать таблицу со связями с CodeFirst в linq2db?
С добавлением foreign key и без использования ALTER TABLE?
CreateTable
C#
1
db.CreateTable<City>();


Цитата Сообщение от Usaga Посмотреть сообщение
Не читаете документацию.
Да вот читаю. Ну или пытаюсь.
Скорее всего неправильно как-то читаю. Может из-за английского, а может из-за того что я тугодум. Но читаю.

Цитата Сообщение от Usaga Посмотреть сообщение
Зачем? Что вы пытались сделать? Linq2Db подключается к проекту с помощью NuGet-пакета.
Пустился во все тяжкие.
В коде нашёл [Association] и решил пошагово посмотреть как это работает.
Но не тут то было. Из-за недостаточности знаний, не смог запустить тесты.

Цитата Сообщение от Usaga Посмотреть сообщение
Только надо документацию читать и примеры использования смотреть.
Вот не нахожу я в примерах [Association]

Цитата Сообщение от Usaga Посмотреть сообщение
Без "Property". Оно и так понятно, что это свойство.
Там конфликт из-за свойства OtherKey = nameof(Country.Id), вот поэтому и дописал Property.
0
Эксперт .NET
 Аватар для Usaga
14724 / 9493 / 1362
Регистрация: 21.01.2016
Сообщений: 35,788
09.01.2021, 11:01
Цитата Сообщение от BeginnerCoderCS Посмотреть сообщение
А linq2db может добавлять вот такую запись?
Хочу я добавить `Город` в `City` по стране `СтарныНет` которой ещё нет в таблице `Country`?
Нет. Linq2Db такое не поддерживает по причине отсутствия механизма ChangeTracking. Вам придётся выполнить такую проверку и добавление самостоятельно. Не такая уж и сложная задача.

Цитата Сообщение от BeginnerCoderCS Посмотреть сообщение
То есть можно создать таблицу со связями с CodeFirst в linq2db?
С добавлением foreign key и без использования ALTER TABLE?
Да блин, нет в Linq2Db нормального механизма миграций. Я не знаю зачем этот метод CreateTable<T> добавили. Скорее всего для временных таблиц. Я вам уже сказал, как вы можете и, по сути, должны сделать: напишите руками один запрос, который все таблицы нужным образом создаёт. И всё, нет проблемы. Можете даже не руками, а используя средства управления нужной СУБД намышковать схему базы и экспортировать DDL создания схемы и вставить в ваш код. Отстаньте вы от бедного Linq2Db с этой задачей. Это в первую очередь гибкая и быстрая ORM.

Цитата Сообщение от BeginnerCoderCS Посмотреть сообщение
Вот не нахожу я в примерах [Association]
Надо прямо гуглить. Документация у них куцая очень. Я гуглил и находил примеры в Issues на их странице проекта на github, а так же редкие ответы на StackOverflow.

Цитата Сообщение от BeginnerCoderCS Посмотреть сообщение
Там конфликт из-за свойства OtherKey = nameof(Country.Id), вот поэтому и дописал Property.
Тогда замените nameof на строку обычную. Конфликта не будет.
1
9 / 6 / 3
Регистрация: 10.01.2020
Сообщений: 330
09.01.2021, 18:16  [ТС]
Ещё вот такой вопрос.

Есть модель DB.
А так же есть модель объектов API сервиса.

Частично данные из API сохраняются в базу.
И естествнно много классов в модели DB и API с одинаковыми именами.
И не пару классов, а много одинаковых имён.

Как лучше поступить в этом случае?
Что мне приходит на ум.

1. Добавить префикс/постфикс к одной модели.
Допустим модель апи сервиса Country, City, User.
А модель базы данных CountryDB, CityDB, UserDB.

2. Использовать алиасы для namespace.
C#
1
2
using MyDB = NameLib.DB.Model;
var country = new MyDB.Country();
Какие ещё есть способы?
И какие подводные камни могут быть?
0
Эксперт .NET
 Аватар для Usaga
14724 / 9493 / 1362
Регистрация: 21.01.2016
Сообщений: 35,788
10.01.2021, 10:19
Цитата Сообщение от BeginnerCoderCS Посмотреть сообщение
Как лучше поступить в этом случае?
Не трогать имена классов. Это нормально, что в вашем приложении есть классы моделей с одинаковыми именами и идентичным составом. Просто эти модели существуют каждая в своём контексте.
1
9 / 6 / 3
Регистрация: 10.01.2020
Сообщений: 330
10.01.2021, 14:23  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Не трогать имена классов. Это нормально, что в вашем приложении есть классы моделей с одинаковыми именами и идентичным составом. Просто эти модели существуют каждая в своём контексте.
Да, но они так же встречаются в одном третьем контексте.
Как тогда лучше делать?
Вот так по-моему не очень красиво

C#
1
2
3
4
5
6
public NameLib.DB.Model.Country ConvertTo(NameLib.API.Model.Country country)
{
    NameLib.DB.Model.Country countryDB = new NameLib.DB.Model.Country();
    // -- // -- // -- //
    return countryDB;
}
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,236
10.01.2021, 14:56
BeginnerCoderCS, для этих целей был придуман Automapper
1
9 / 6 / 3
Регистрация: 10.01.2020
Сообщений: 330
10.01.2021, 18:05  [ТС]
Цитата Сообщение от IamRain Посмотреть сообщение
BeginnerCoderCS, для этих целей был придуман Automapper
Ну и зачем???

Шучу конечно ))
Посмотрю что за зверь.

p.s. Вроде только перестал задавать вопросы по использованию одной библиотеки, так вы мне ещё одну ))
0
Эксперт .NET
 Аватар для Usaga
14724 / 9493 / 1362
Регистрация: 21.01.2016
Сообщений: 35,788
11.01.2021, 08:07
BeginnerCoderCS, условно говоря, эта библиотека ничего волшебного не делает. Чисто кому лень руками маперы писать. Если нет желания или времени, то на пока эту библиотеку можно и обойти стороной.
0
9 / 6 / 3
Регистрация: 10.01.2020
Сообщений: 330
12.01.2021, 00:56  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Если нет желания или времени, то на пока эту библиотеку можно и обойти стороной.
Да согласен.
Почитал за мапперы, и на текущий момент мне это скорее всего не нужно будет.
Там частично только пересекаются данные.

Тем более типы классов будут частично разными.
К примеру CountryId у API это string а у БД это int так как это внешний ключ таблицы Country
API класс

C#
1
2
3
4
5
6
public class City
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string CountryId { get; set; }
}


DB класс

C#
1
2
3
4
5
6
7
8
9
10
11
public class City
{
    [PrimaryKey, Identity]
    public int Id { get; set; }
    [Column]
    public string Name { get; set; }
    [Column]
    public int CountryId { get; set; }
    [Association(ThisKey = nameof(CountryId), OtherKey = nameof(Country.Id)]
    public Country { get; set; }
}

Хотя я пробежался только по верхушке, может конечно и это решает автомаппер.

А по namespace вопрос так и открыт ((
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,236
12.01.2021, 01:16
К примеру CountryId у API это string а у БД
Ну вот и приехали в 21 век - CPU быстрые, сети быстрые, можно херачить строками все Dto, и JS- ом писать на бэкенде...
0
Эксперт .NET
 Аватар для Usaga
14724 / 9493 / 1362
Регистрация: 21.01.2016
Сообщений: 35,788
12.01.2021, 06:39
Цитата Сообщение от BeginnerCoderCS Посмотреть сообщение
К примеру CountryId у API это string а у БД это int так как это внешний ключ таблицы Country
А вот это уже требует уточнений. Кто сделал CountryId строкой и почему? Что этот ID из себя представляет? ID из какой системы? Из чужой или вашей? Вполне возможно, что тут уже вопрос не только про автомапер, но и про пересмотр схемы модели данных.

Цитата Сообщение от BeginnerCoderCS Посмотреть сообщение
А по namespace вопрос так и открыт ((
А в чём вопрос-то?
0
800 / 583 / 207
Регистрация: 21.02.2019
Сообщений: 2,095
12.01.2021, 15:04
Цитата Сообщение от Usaga Посмотреть сообщение
Кто сделал CountryId строкой и почему?
..как-то где-то у меня была (давно, правда) проблема с разными браузерами (в частности IE), которые странно интерпретировали decimal, передаваемый в JSON, поэтому костылем стало решение передавать его в виде строки, а там уж в JS парсить .... возможно и тут что-то подобное ...
0
Эксперт .NET
 Аватар для Usaga
14724 / 9493 / 1362
Регистрация: 21.01.2016
Сообщений: 35,788
12.01.2021, 18:33
carrotik, вряд ли тут что-то такое) Скорее всего CountryId сделали строкой по каким-то мало адекватным причинам, если там число натуральное, а не цифробуквенный код какой-то.
0
9 / 6 / 3
Регистрация: 10.01.2020
Сообщений: 330
13.01.2021, 15:14  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
А вот это уже требует уточнений. Кто сделал CountryId строкой и почему? Что этот ID из себя представляет? ID из какой системы? Из чужой или вашей? Вполне возможно, что тут уже вопрос не только про автомапер, но и про пересмотр схемы модели данных.
Это я не корректно описал.
Суть вот такая.
Я получаю из сервиса данные строковые
Id = 8767
Name = "Евгений"
Country = "Россия"
City = "Москва"

Сервис

C#
1
2
3
4
5
6
7
public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Country { get; set; }
    public string City { get; set; }
}


Но в БД у меня из этого выходит 3 таблицы со связями. User, Country, City.
БД

C#
1
2
3
4
5
6
7
8
9
10
11
public class User
{
    [PrimaryKey]
    public int Id { get; set; }
    [Column]
    public string Name { get; set; }
    [Column]
    public int CountryId { get; set; } // Внешний Id таблицы Country
    [Column] 
    public int CityId { get; set; } // Внешний Id таблицы City
}


В итоге было Country = "Россия" а стало CountryId = 1
City = "Москва" - CityId = 1


Так правильно делаю? или опять нет?

Добавлено через 12 минут
Цитата Сообщение от Usaga Посмотреть сообщение
А в чём вопрос-то?
Вот он выше.

Архитектура построения БД linq2db
0
Эксперт .NET
 Аватар для Usaga
14724 / 9493 / 1362
Регистрация: 21.01.2016
Сообщений: 35,788
14.01.2021, 06:26
Цитата Сообщение от BeginnerCoderCS Посмотреть сообщение
Так правильно делаю?
Да.

Цитата Сообщение от BeginnerCoderCS Посмотреть сообщение
Вот он выше.
Просто копируете данные из одного класса в другой. Можете руками. Можете с помощью автомапера. Перенос данных между модельками из разных "слоёв" - нормальное явление.
0
9 / 6 / 3
Регистрация: 10.01.2020
Сообщений: 330
14.01.2021, 11:07  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Просто копируете данные из одного класса в другой. Можете руками. Можете с помощью автомапера. Перенос данных между модельками из разных "слоёв" - нормальное явление.
Я тут не за сам перенос спрашиваю.
Я говорю о одинаковых именах классов, и если писать полный путь namespace-ов то очень не красиво, и очень не быстро писать получается. Да и не читаемо.
Выше вы сказали что переименовывать классы не нужно. Как тогда лучше обращаться к классам с одними и теми же именами, из тертьего namespace
0
Эксперт .NET
 Аватар для Usaga
14724 / 9493 / 1362
Регистрация: 21.01.2016
Сообщений: 35,788
14.01.2021, 11:35
Цитата Сообщение от BeginnerCoderCS Посмотреть сообщение
Как тогда лучше обращаться к классам с одними и теми же именами, из тертьего namespace
Только с указанием пространств имён.

Добавлено через 7 минут
Смотрите сами. Если вам так неудобно, то можете и названия разные давать. Но в один прекрасный момент поймёте, что названия вида OrderModelForMonthTaxCalculation не сильно-то и красивее.
1
9 / 6 / 3
Регистрация: 10.01.2020
Сообщений: 330
22.01.2021, 09:05  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
BeginnerCoderCS, в таком случае, можно написать один запрос к базе, который при запуске выполнится. В этом запросе вы будете проверять наличие нужных таблиц и создавать их. Для этого не надо писать N отдельных методов вида CreateTable для каждой таблицы.
Дошёл до того момента, в котором нужно создавать базу не у меня, а у пользователя, и не руками, как делал при проектировании.
Подскажите каким образом, это можно будет нормально поддерживать?

База MySQL. Делаю экспорт модели бд из HeidiSQL в файл sql.

Но если есть хоть одна таблица то будет ошибка.

Но больше интересует поддержка в дальнейшем.
Допустим есть у нас таблица Country с полями Id, Name.
Но в дальнейшем мне нужно будет добавить ещё поле ContinentId, и сделать внешний ключ.

Мне нужно будет делать ещё один запрос, на изменение таблицы.
Но затем ещё один столбец и ещё один запрос на изменение.

А потом у пользователя ляжет база, и её нужно будет пересоздать, мне нужно всю эту последовательность обновлений БД хранить? А если этих обновлнений будет десятки а то и сотни, а их так и будет в итоге, то что делать тогда?

Тем более, я не смогу проверить правильно ли создана БД у пользователя.

Что-то я опять в тупике.

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

p.s. Напомню, что будет несколько приложений, которые будут использовать одну базу.
То есть запросы на создание таблиц, как я понимаю должны храниться в dll в котором и сущности бд?
0
Эксперт .NET
 Аватар для Usaga
14724 / 9493 / 1362
Регистрация: 21.01.2016
Сообщений: 35,788
22.01.2021, 09:11
BeginnerCoderCS, мы это делаем так: завели отдельную таблицу под версию базы. Все скрипты изменения базы идут последовательно, записывая имя операции (Add Email into Users table) в эту таблицу. Каждый скрипт проверяет наличие такой записи в этой таблице, и если есть, то не исполняется.

Все эти скрипты мы собираем в один SQL-файл и выполняем у всех пользователей. Получается, что какая бы версия ни была у пользователя, база обновится до актуальной корректным образом.
1
9 / 6 / 3
Регистрация: 10.01.2020
Сообщений: 330
22.01.2021, 09:19  [ТС]

Цитата Сообщение от Usaga Посмотреть сообщение
мы это делаем так: завели отдельную таблицу под версию базы
Таблица в текущей БД? Для хранения истории изменений самой БД?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.01.2021, 09:19

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...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru