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

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

06.01.2021, 08:43. Показов 25735. Ответов 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
14747 / 9521 / 1364
Регистрация: 21.01.2016
Сообщений: 35,919
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
14747 / 9521 / 1364
Регистрация: 21.01.2016
Сообщений: 35,919
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
14747 / 9521 / 1364
Регистрация: 21.01.2016
Сообщений: 35,919
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
14747 / 9521 / 1364
Регистрация: 21.01.2016
Сообщений: 35,919
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,020
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,020
03.06.2021, 13:15
Цитата Сообщение от BeginnerCoderCS Посмотреть сообщение
Там то дело и не в ОРМ.
Что не помешает решить 99% проблем работы с БД, просто выкинув ОРМ
0
9 / 6 / 3
Регистрация: 10.01.2020
Сообщений: 330
03.06.2021, 13:25  [ТС]
Цитата Сообщение от Катафалк Посмотреть сообщение
Что не помешает решить 99% проблем работы с БД, просто выкинув ОРМ
То есть тему посмотрели, ответа у вас нет, и вы решили дальше троллить о ОРМ?
Повторяю ещё раз, там вопрос не про ОРМ.
0
Эксперт .NET
 Аватар для Usaga
14747 / 9521 / 1364
Регистрация: 21.01.2016
Сообщений: 35,919
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,020
04.06.2021, 14:01
Цитата Сообщение от Usaga Посмотреть сообщение
Сможете назвать хоть одну проблему из той ветки порождённую ORM'кой?
Понятия не имею, я ту ветку не открывал даже Просто пока в проекте ОРМ, разговаривать о решении каких-то других проблем преждевременно - сначала надо избавиться от самого главного источника проблем.
0
04.06.2021, 14:28

Не по теме:

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

0
Эксперт .NET
 Аватар для Usaga
14747 / 9521 / 1364
Регистрация: 21.01.2016
Сообщений: 35,919
04.06.2021, 18:00
Цитата Сообщение от Катафалк Посмотреть сообщение
Понятия не имею
Вот и всё, что стоит знать о стоимости ваших советов...
1
282 / 485 / 12
Регистрация: 21.06.2019
Сообщений: 3,020
04.06.2021, 18:47
Цитата Сообщение от Usaga Посмотреть сообщение
Вот и всё, что стоит знать о стоимости ваших советов...
Ну если не в состоянии мыслить стратегически хоть на пару шагов вперед, а не закидать задачу говнокодом - то да, можно вообще ничего не знать кроме ОРМ.
0
Эксперт .NET
 Аватар для Usaga
14747 / 9521 / 1364
Регистрация: 21.01.2016
Сообщений: 35,919
05.06.2021, 13:48
Катафалк, повторяюсь: если вам нечего конкретного ответить, то и заходить сюда не зачем. Вашей болтологии вполне хватает в ветке "Обо всём". А тут конкретные вещи обсуждаются.
0
282 / 485 / 12
Регистрация: 21.06.2019
Сообщений: 3,020
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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Программа опроса у.з. расходомера 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