9 / 6 / 3
Регистрация: 10.01.2020
Сообщений: 330

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

06.01.2021, 08:43. Показов 25733. Ответов 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
14745 / 9519 / 1364
Регистрация: 21.01.2016
Сообщений: 35,915
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
14745 / 9519 / 1364
Регистрация: 21.01.2016
Сообщений: 35,915
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
4695 / 2702 / 735
Регистрация: 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
14745 / 9519 / 1364
Регистрация: 21.01.2016
Сообщений: 35,915
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
4695 / 2702 / 735
Регистрация: 02.08.2011
Сообщений: 7,236
12.01.2021, 01:16
К примеру CountryId у API это string а у БД
Ну вот и приехали в 21 век - CPU быстрые, сети быстрые, можно херачить строками все Dto, и JS- ом писать на бэкенде...
0
Эксперт .NET
 Аватар для Usaga
14745 / 9519 / 1364
Регистрация: 21.01.2016
Сообщений: 35,915
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
14745 / 9519 / 1364
Регистрация: 21.01.2016
Сообщений: 35,915
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
14745 / 9519 / 1364
Регистрация: 21.01.2016
Сообщений: 35,915
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
14745 / 9519 / 1364
Регистрация: 21.01.2016
Сообщений: 35,915
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
14745 / 9519 / 1364
Регистрация: 21.01.2016
Сообщений: 35,915
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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru