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

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

06.01.2021, 08:43. Показов 24592. Ответов 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
14087 / 9305 / 1348
Регистрация: 21.01.2016
Сообщений: 34,944
19.03.2021, 10:27
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от BeginnerCoderCS Посмотреть сообщение
Наверное не правильно, но очень удобно, создать подключение к бд в начале выполнения, проверить корректность, и уже потом дёргать когда нужно, без нагромождений using и т.д.
В случае с Linq2Db и дополнительной строкой кода в конструкторе может быть допустимо держать один единственный контекст на всё время жизни приложения. Лучше этого избегать всеми силами, но если сложно нормально архитектуру продумать приложения и на руках Linq2Db, то это возможно.

Вопрос с открытым подключением касается не только каких-то там тайм-аутов со стороны СУБД, но и транзакций. Особенно в лице TransactionScope. Почитайте об этом. Этот момент не относится к ORM, он из ADO.NET самого исходит.
1
9 / 6 / 3
Регистрация: 10.01.2020
Сообщений: 330
19.03.2021, 13:00  [ТС]
Что-то я запутался совсем.
Как можно позже открывать соединение, и как можно раньше закрывать.

А как быть с паттерном (или антипаттерном) Repository?
Вот даже у ms https://docs.microsoft.com/en-... pplication

При создании объекта в него передаётся экземпляр созданного подключения.
И потом оно (подключение) используется в приложении.

Вот и у меня по такому типу сделан generic repository.
Я создаю объект REPO в начале метода, а потом ещё несколько раз обращаюсь к этому REPO.
Если использовать using, то создавать объект REPO придётся несколько раз внутри одного метода.
Это же не нормально?

Для сравнения создание одного REPO
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
var db = new DB(...);
var repo = new Repo<Table>(db);
 
var listTables1 = repo.Get(x=>x.Date >= DateTime.Now);
var listTables2 = repo.Get(x=>x.Date >= DateTime.Now.AddDays(-30));
 
// ....
 
repo.Update(listTables1);
repo.Update(listTables2);
 
db?.Close();
db?.Dispose();

А если с использованием using
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
List<Table> listTables1 = null;
List<Table> listTables2 = null;
 
using (var db = new DB(...))
{
    var repo = new Repo<Table>(db);
    listTables1 = repo.Get(x=>x.Date >= DateTime.Now);
    listTables2 = repo.Get(x=>x.Date >= DateTime.Now.AddDays(-30)); 
}
 
 
using (var db = new DB(...))
{
    var repo = new Repo<Table>(db);
    repo.Update(listTables1);
    repo.Update(listTables2);
}
И это при условии, что попарно получаются данные и сохраняются.
А если каждый отдельно, то это уже 4 создания using и как следствие 4 создания REPO.


Выносить каждый запрос в отдельный метод?

Добавлено через 1 час 24 минуты
Цитата Сообщение от Usaga Посмотреть сообщение
Лучше этого избегать всеми силами
Забыл прокоментировать (
0
Эксперт .NET
 Аватар для Usaga
14087 / 9305 / 1348
Регистрация: 21.01.2016
Сообщений: 34,944
19.03.2021, 13:24
Цитата Сообщение от BeginnerCoderCS Посмотреть сообщение
Как можно позже открывать соединение, и как можно раньше закрывать.
В случае с Linq2Db я вам показал какую строку нужно в конструктор контекста добавить. По умолчанию, Linq2Db открывает подключение к базе при первом запросе (не создании контекста, а именно запросе!) и удерживает до вызова Dispose. Строка, что я показал указывает ORM'ке на то, что подключение сразу после выполнения запроса нужно закрывать. С учётом отсутствия у Linq2Db каких-либо кешей "сущностей" это позволяет удерживать экземпляр одного контекста неограниченно долго, хоть это и не очень хороший подход.

Цитата Сообщение от BeginnerCoderCS Посмотреть сообщение
Вот и у меня по такому типу сделан generic repository.
Я создаю объект REPO в начале метода, а потом ещё несколько раз обращаюсь к этому REPO.
Если использовать using, то создавать объект REPO придётся несколько раз внутри одного метода.
Это же не нормально?
По хорошему, вам нужно использовать Dependency Injection для получения всех необходимых зависимостей в конструкторе. И уже в точке композиции определять какой сервис как долго будет жить.

В вашем случае можно немного всё упростить. Просо заведите класс DataService (или аналогичным образом названный) с методом GetRepository<T>, где T - одна из сущностей контекста. Этот класс будет реализовывать IDisposable и будет служить обёрткой вокруг контекста, который будет передаваться всем запрошенным репозиториям.

В таком случае вы можете оперировать интерфейсом или абстрактным классом репозитория и даже не видеть (вне репозитория) Linq2Db.

А в случае с таким подходом:

C#
1
2
3
4
5
6
using (var db = new DB(...))
{
    var repo = new Repo<Table>(db);
    repo.Update(listTables1);
    repo.Update(listTables2);
}
... репозитории тупо бесполезны и просто захламляют код. В таком случае и Linq2Db выставлен наружу, и конкретные класс репозиториев. И ручное их создание с передачей в них контекста. Вы тут просто дырявую обёртку сделали, которая вообще ничего не скрывает, но добавляет сложностей.

Либо вообще уберите репозитории и работайте с контекстом напрямую. Либо сокройте все детали работы с ORM (и вообще сам факт его существования) в DataService и репозитории.
1
9 / 6 / 3
Регистрация: 10.01.2020
Сообщений: 330
19.03.2021, 14:54  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Просо заведите класс DataService (или аналогичным образом названный) с методом GetRepository<T>
Я правильно вас понял?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public partial class DataService : IDisposable
{
    public DataService(string connectionString)
    {
        db = new DB(connectionString);
    }
 
    private readonly DB db;
 
    public Repo<T> GetRepository<T>() where T : class
    {
        return new Repo<T>(db);
    }
 
    public void Dispose()
    {
        // Тут всё верно?
        db?.Close();
        db?.Dispose();
    }
}
0
Эксперт .NET
 Аватар для Usaga
14087 / 9305 / 1348
Регистрация: 21.01.2016
Сообщений: 34,944
20.03.2021, 11:58
BeginnerCoderCS,

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public partial class DataService : IDisposable
{
    private readonly DB db;
 
    public DataService()
    {
        var connectionString = ... читаем из настроек
        db = new DB(connectionString);
    }
 
    public IRepo<T> GetRepository<T>() where T : class
    {
        return new Repo<T>(db);
    }
 
    public void Dispose()
    {
        db.Dispose();
    }
}
1
9 / 6 / 3
Регистрация: 10.01.2020
Сообщений: 330
20.03.2021, 12:55  [ТС]
Usaga, db?.Close(); не нужен? Только db.Dispose()?
0
Эксперт .NET
 Аватар для Usaga
14087 / 9305 / 1348
Регистрация: 21.01.2016
Сообщений: 34,944
20.03.2021, 13:39
BeginnerCoderCS, да.
1
9 / 6 / 3
Регистрация: 10.01.2020
Сообщений: 330
03.06.2021, 09:04  [ТС]
Usaga, Элд Хасп, не стал писать сюда вопрос так как вопрос выходит за рамки построения архитектуры, но там используется linq2db, так что может подскажете?
https://www.cyberforum.ru/ado-... 42736.html
0
282 / 485 / 12
Регистрация: 21.06.2019
Сообщений: 3,018
03.06.2021, 11:57
0
9 / 6 / 3
Регистрация: 10.01.2020
Сообщений: 330
03.06.2021, 12:00  [ТС]
Цитата Сообщение от Катафалк Посмотреть сообщение
Оптимально - это выкинуть нафиг орм
О Хоспаде опять ))

Там то дело и не в ОРМ.
Перейдите в ветку и составьте SQL запрос. Чтобы без ОРМ.
0
282 / 485 / 12
Регистрация: 21.06.2019
Сообщений: 3,018
03.06.2021, 13:15
Цитата Сообщение от BeginnerCoderCS Посмотреть сообщение
Там то дело и не в ОРМ.
Что не помешает решить 99% проблем работы с БД, просто выкинув ОРМ
0
9 / 6 / 3
Регистрация: 10.01.2020
Сообщений: 330
03.06.2021, 13:25  [ТС]
Цитата Сообщение от Катафалк Посмотреть сообщение
Что не помешает решить 99% проблем работы с БД, просто выкинув ОРМ
То есть тему посмотрели, ответа у вас нет, и вы решили дальше троллить о ОРМ?
Повторяю ещё раз, там вопрос не про ОРМ.
0
Эксперт .NET
 Аватар для Usaga
14087 / 9305 / 1348
Регистрация: 21.01.2016
Сообщений: 34,944
04.06.2021, 05:57
Цитата Сообщение от Катафалк Посмотреть сообщение
Что не помешает решить 99% проблем работы с БД, просто выкинув ОРМ
Сможете назвать хоть одну проблему из той ветки порождённую ORM'кой?
1
9 / 6 / 3
Регистрация: 10.01.2020
Сообщений: 330
04.06.2021, 10:29  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Сможете назвать хоть одну проблему из той ветки порождённую ORM'кой?
А зачем? Ведь есть чудесный способ
Цитата Сообщение от Катафалк Посмотреть сообщение
Что не помешает решить 99% проблем работы с БД, просто выкинув ОРМ
Не знаю как это работает, но как только выбросил ОРМ сразу всё заработало
0
282 / 485 / 12
Регистрация: 21.06.2019
Сообщений: 3,018
04.06.2021, 14:01
Цитата Сообщение от Usaga Посмотреть сообщение
Сможете назвать хоть одну проблему из той ветки порождённую ORM'кой?
Понятия не имею, я ту ветку не открывал даже Просто пока в проекте ОРМ, разговаривать о решении каких-то других проблем преждевременно - сначала надо избавиться от самого главного источника проблем.
0
04.06.2021, 14:28

Не по теме:

.. ну а что .. зачем эти орм, адаптеры-шмадаптеры ... в коде приложения генерируем запросы в виде скриптов, сохраняем в файл .sql ... а ответ сохраняем в файле CSV, который и читаем из кода ... чистенько и ортодоксально ... :)

0
Эксперт .NET
 Аватар для Usaga
14087 / 9305 / 1348
Регистрация: 21.01.2016
Сообщений: 34,944
04.06.2021, 18:00
Цитата Сообщение от Катафалк Посмотреть сообщение
Понятия не имею
Вот и всё, что стоит знать о стоимости ваших советов...
1
282 / 485 / 12
Регистрация: 21.06.2019
Сообщений: 3,018
04.06.2021, 18:47
Цитата Сообщение от Usaga Посмотреть сообщение
Вот и всё, что стоит знать о стоимости ваших советов...
Ну если не в состоянии мыслить стратегически хоть на пару шагов вперед, а не закидать задачу говнокодом - то да, можно вообще ничего не знать кроме ОРМ.
0
Эксперт .NET
 Аватар для Usaga
14087 / 9305 / 1348
Регистрация: 21.01.2016
Сообщений: 34,944
05.06.2021, 13:48
Катафалк, повторяюсь: если вам нечего конкретного ответить, то и заходить сюда не зачем. Вашей болтологии вполне хватает в ветке "Обо всём". А тут конкретные вещи обсуждаются.
0
282 / 485 / 12
Регистрация: 21.06.2019
Сообщений: 3,018
05.06.2021, 16:30
Цитата Сообщение от Usaga Посмотреть сообщение
А тут конкретные вещи обсуждаются.
Нельзя обсуждать конкретные вещи, не изучив общие фундаментальные вещи. Вернее, обсуждать то можно, но в голове от этого ничего не прибавится, а должно бы
Пришлось таки ту ветку почитать. Ну что тут можно сказать - все верно, ОРМ и среда, ее породившая и поощряющая скакание по верхам вместо глубокого изучения в данном случае БД имеет самое прямое отношение к проблеме автора. Задача его решается элементарно на стороне БД, но он зачем то собирался выгружать данные на клиента Про триггеры, вероятно, впервые узнал
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.06.2021, 16:30
Помогаю со студенческими работами здесь

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


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

Или воспользуйтесь поиском по форуму:
100
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru