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

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

06.01.2021, 08:43. Показов 25711. Ответов 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
14731 / 9505 / 1363
Регистрация: 21.01.2016
Сообщений: 35,857
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
14731 / 9505 / 1363
Регистрация: 21.01.2016
Сообщений: 35,857
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
14731 / 9505 / 1363
Регистрация: 21.01.2016
Сообщений: 35,857
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
14731 / 9505 / 1363
Регистрация: 21.01.2016
Сообщений: 35,857
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
14731 / 9505 / 1363
Регистрация: 21.01.2016
Сообщений: 35,857
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
14731 / 9505 / 1363
Регистрация: 21.01.2016
Сообщений: 35,857
04.06.2021, 18:00
Цитата Сообщение от Катафалк Посмотреть сообщение
Понятия не имею
Вот и всё, что стоит знать о стоимости ваших советов...
1
282 / 485 / 12
Регистрация: 21.06.2019
Сообщений: 3,020
04.06.2021, 18:47
Цитата Сообщение от Usaga Посмотреть сообщение
Вот и всё, что стоит знать о стоимости ваших советов...
Ну если не в состоянии мыслить стратегически хоть на пару шагов вперед, а не закидать задачу говнокодом - то да, можно вообще ничего не знать кроме ОРМ.
0
Эксперт .NET
 Аватар для Usaga
14731 / 9505 / 1363
Регистрация: 21.01.2016
Сообщений: 35,857
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
Ответ Создать тему
Новые блоги и статьи
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru