csharp_ci | Unsorted

Telegram-канал csharp_ci - C# (C Sharp) programming

18377

По всем вопросам- @haarrp C# - обучающий канал Senior C# разработчика. @ai_machinelearning_big_data - Machine learning @itchannels_telegram - 🔥лучшие ит-каналы @csharp_ci - C# академия @pythonlbooks- книги📚 Реестр РКН: https://clck.ru/3Fk3kb

Subscribe to a channel

C# (C Sharp) programming

Никогда не возвращай null для коллекций в C#

Спорное мнение, но на практике это один из самых частых источников багов.

Когда метод возвращает null вместо списка, ты заставляешь каждого, кто его вызывает, писать дополнительную проверку.

Иначе всё ломается на самом банальном месте:


foreach (var transaction in GetTransactions(userId))
{
// boom, если null
}


В итоге получаешь:

• лишние null-проверки повсюду
• более громоздкий код
• ошибки в рантайме, если кто-то забыл проверить

Всегда этого возвращай пустую коллекцию:


Enumerable.Empty<T>()
new List<T>()
[] в C# 12
var transactions = GetTransactions(userId)
?? Enumerable.Empty<TransactionDto>();


Теперь код становится чище и понятнее.

Ты всегда можешь итерироваться и не думаешь о null каждый раз.

Хороший API - это тот, в работе с которым ошибиться почти невозможно.

Читать полностью…

C# (C Sharp) programming

🔥 Самая недооценённая фича HttpClient в .NET

DelegatingHandler - это middleware для исходящих HTTP-запросов, про который многие забывают.

По сути, ты собираешь pipeline для запросов так же, как в ASP.NET для входящих.

И вместо того чтобы пихать логику в каждый вызов, выносишь всё в одно место.

Авторизация, логирование, ретраи, кеш, аудит, всё навешивается как цепочка обработчиков.

Код становится чище, повторного кода меньше, а поведение запросов контролируется централизованно.

Один раз настроил и это работает для всех клиентов.

Если используешь HttpClient и до сих пор не трогаешь DelegatingHandler, ты реально упускаешь мощный инструмент

Читать полностью…

C# (C Sharp) programming

Skywork выкатили Matrix-Game 3.0 - и это уже почти живая игровая вселенная, генерируемая ИИ

720p в реальном времени при 40 FPS
5B модель с INT8-квантизацией - работает удивительно быстро

Главный фокус - стабильность во времени:
модель запоминает прошлые кадры и “достраивает” будущее без развалов сцены

Есть и более мощная версия - 28B MoE, которая лучше держит физику и динамику

Как обучали:
Unreal Engine + AAA-игры + реальные видео

Внутри не просто видео, а связка:
Video + Pose + Action + Prompt
за счёт этого можно генерировать длинные, осмысленные сцены

Это зачатки полноценного AI-геймдвижка

Ссылка на модель: https://modelscope.ai/models/Skywork/Matrix-Game-3.0

Читать полностью…

C# (C Sharp) programming

Нужны твои навыки в работе с ИИ на МТС True Tech Hack 2026!

Тебе сюда, если ты инженер данных, разработчик или системный аналитик. 1 500 000 рублей — общий призовой фонд ИТ-соревнования.

Формат: командное онлайн-соревнование с финалом в Москве. Если нет команды — поможем найти на платформе мероприятия.

Тебя ждут три задачи на выбор — каждая с уникальной технической фишкой.

Для всех финалистов — приглашение на закрытую вечеринку, а лучших участников позовут на стажировку.

Успей зарегистрироваться до 9 апреля

Читать полностью…

C# (C Sharp) programming

MWS Cloud Platform приглашает на сеньорский митап

Что обсудим:
→ Почему vhost-user обходит virtio-net
→ Когда писать свой балансировщик вместо HAProxy
→ Почему нельзя выбрать один язык для платформы

Поспорим на дебатах Go vs Kotlin — все желающие могут присоединиться и задавать вопросы из зала.

📅 9 апреля, 18:00
📍 Место Санкт-Петербург, Конногвардейский бульвар, 4, Mishka Bar
Для кого: сеньоров-разработчиков, сетевых инженеров и архитекторов облачных платформ
Сложность докладов: 8/10
Места ограничены, регистрация обязательна. 👉

Читать полностью…

C# (C Sharp) programming

#ПятничныйКвиз #карательныйсишарп

Читать полностью…

C# (C Sharp) programming

🚀 Почему этот EF Core код тормозит?

Технически - всё ок.
По производительности не очень.

Вот типичная ошибка:

❌ Загружаешь всю сущность (все колонки)
❌ Потом фильтруешь и мапишь уже в памяти

Что происходит:
- лишние данные тянутся из БД
- растёт нагрузка на сеть
- увеличивается потребление памяти
- замедляется приложение

✅ Как правильно:

Используй проекцию через `.Select()` прямо в запросе:

- берёшь только нужные поля
- меньше данных из БД
- быстрее запрос
- меньше нагрузка на систему

📌 Правило простое:
Не тащи всё - бери только то, что используешь

Именно такие мелочи чаще всего дают x2–x10 к скорости.

Читать полностью…

C# (C Sharp) programming

🚀 Динамические Claims в ASP.NET Core

Хотите добавлять права пользователю прямо во время выполнения приложения?

В ASP.NET Core это можно сделать через Claims Transformation.

Что это даёт:

- можно подтягивать данные из базы или внешнего сервиса
- добавлять их в HttpContext.User
- строить гибкие политики авторизации

То есть права пользователя можно расширять динамически, без изменения токена или повторной аутентификации.

Пример из поста:

Во время трансформации claims добавляется новый claim:

CardType = "platinum"

После этого можно создать policy:

- пользователь должен быть аутентифицирован
- у него должен быть claim CardType = platinum

И использовать её в авторизации.

Это особенно полезно для:

- RBAC (role-based access control)
- сложных систем прав
- динамических разрешений из БД
- feature-based доступа

Например:

- premium пользователь
- платиновая карта
- доступ к закрытому API
- платные функции

Claims Transformation позволяет подмешивать эти права на лету.

Полная статья:
https://milanjovanovic.tech/blog/master-claims-transformation-for-flexible-aspnetcore-authorization

Читать полностью…

C# (C Sharp) programming

FluentValidation делает валидацию входных данных очень простой.

Знаете ли вы, что валидаторы поддерживают DI (Dependency Injection)?

Можно внедрять объекты настроек, настроенные через DI, и использовать их прямо внутри валидаторов.

Посмотрите пример в коде ниже.

Читать полностью…

C# (C Sharp) programming

Разработчик показал, как использовать Ollama для извлечения данных из чеков прямо в .NET.

Самая интересная часть оказалась не в том, чтобы отправить изображение модели.

Гораздо сложнее было получить результат, который можно реально использовать в коде.

Обычный текстовый ответ мало помогает, когда нужны структурированные данные:

- позиции из чека
- количество
- цены
- итоговая сумма

Поэтому вместо обычного ответа модель начали просить возвращать JSON.

После этого результат можно сразу маппить в C#-объекты и использовать в приложении.

И именно здесь начинается самое интересное.

Большая часть работы — не код, а правильный prompt.

Если модель:

- округляла цену
- пропускала цифру
- или «придумывала» позицию

приходилось уточнять инструкции.

Это и есть главный сдвиг в таком подходе:

раньше разработчик писал парсеры и regex,
а теперь — настраивает поведение модели через prompt.

Когда модель начинает возвращать структурированные данные,
всё остальное снова превращается в обычный код приложения.

Разбор полной реализации:

https://milanjovanovic.tech/blog/how-to-extract-structured-data-from-images-using-ollama-in-dotnet

🚀 Max

#ai #ollama #dotnet #csharp

Читать полностью…

C# (C Sharp) programming

🔵Ozon Tech приглашает на Community .NET Meetup
24 марта (вторник) в Москве (Лофт Casa Picassa) и онлайн.

В программе три доклада, много кейсов и камерная дискуссия без записи. В фокусе primitive obsession, нагрузка с Load Shedding и Escape Analysis в JIT.

За подробной программой и регистрацией — сюда ⬅️

Читать полностью…

C# (C Sharp) programming

C# records - идеальный способ создавать value objects.

Почему это важно?

В DDD value object должен:
- быть неизменяемым (immutable)
- сравниваться по значениям, а не по ссылке

Именно это records дают из коробки.

Что получаем:
- неизменяемость через init
- структурное сравнение (Value Equality)
- короткий и чистый синтаксис
- deconstruction
- pattern matching

Пример:


public class Booking
{
public Address Address { get; init; }
public DateRange Period { get; init; }
}

public record Address(
string Street,
string City,
string State,
string Country,
string ZipCode);

Теперь два Address считаются равными, если совпадают их поля - без переопределения Equals и GetHashCode.

Раньше для value object приходилось писать:
• конструкторы
• Equals
• GetHashCode
• оператор ==

Теперь - одна строка.

Records делают value objects:

• безопаснее
• проще
• ближе к функциональному стилю

Если используете DDD в .NET - records должны быть стандартом для value objects.

Читать полностью…

C# (C Sharp) programming

В .NET 8 появился простой способ сделать HttpClient устойчивым к сбоям — буквально одной строкой.

Microsoft добавила библиотеку Microsoft.Extensions.Http.Resilience, в которой уже есть готовые pipeline’ы для обработки ошибок при HTTP-запросах.

Что это даёт из коробки:
- Retry при временных сбоях
- Timeout
- Circuit Breaker
- Rate limiting
- Защиту от перегрузки

Подключается максимально просто:


services.AddHttpClient<GitHubService>(static httpClient =>
{
httpClient.BaseAddress = new Uri("https://api.github.com/");
})
.AddStandardResilienceHandler();

Читать полностью…

C# (C Sharp) programming

🖥 Разделяйте код с помощью Domain Events

Без событий сервисы быстро превращаются в «комбайн»:
— бизнес-логика
— отправка email
— аналитика
— интеграции
— и всё в одном методе

Каждая новая функция добавляет прямые зависимости.
Метод растёт. Связанность увеличивается. Поддержка усложняется.

С Domain Events подход меняется:

Вы выполняете бизнес-действие и просто публикуете событие.


await _domainEventsDispatcher.DispatchAsync(
[new UserRegisteredDomainEvent(user.Id, user.Email)]
);


Дальше система реагирует сама:

- отправка приветственного письма
- трекинг в аналитике
- интеграции
- любые новые сценарии

И всё это без изменения UserService.

Преимущества:

- никаких жёстких зависимостей
- сервисы меньше и чище
- легче тестировать
- проще масштабировать
- новые фичи добавляются без переписывания существующего кода

Публикуешь один раз - система расширяется сама.

Читать полностью…

C# (C Sharp) programming

🖥 Асинхронщина ломает интеграционные тесты? Есть простой паттерн

Проблема:

Вы отправляете событие в одном модуле…
И начинаете ждать.

Если используете Thread.Sleep
готовьтесь к:
- медленным тестам
- flaky-падениям
- ненависти от CI/CD

Решение — Retry Assertion (Polling)

Как работает паттерн:

1. Выполняем команду (Module A)
2. Периодически опрашиваем состояние (Module B)
3. Ждём, пока результат появится
4. Делаем assert

Схема:

- Execute Command (Module A)
- Poll Query (Module B) until result != null
- Assert

Почему это лучше:

- Нет случайных падений
- Тесты работают быстрее
- Полностью детерминированное поведение
- Отлично подходит для async, событий и modular monolith

Главная идея:

Не жди фиксированное время — жди состояние.

Такой подход превращает нестабильные интеграционные тесты в надёжные и быстрые.

Читать полностью…

C# (C Sharp) programming

🚨 Тихий убийца производительности в EF Core, о котором забывают почти все.

Запрос выглядит идеально - пока у тебя мало данных. Потом начинается ад.

Ты пишешь обычный Include, потом ещё один на ту же сущность… и не замечаешь, как EF Core превращает это в монструозный SQL с кучей JOIN’ов.
Что происходит под капотом:
EF делает несколько JOIN’ов → получается cross product → строки начинают дублироваться
Итог:

• данных в ответе становится в разы больше
• память улетает
• запросы резко тормозят

И всё это без единой ошибки в коде.

Решение есть и оно банально простое - Query Splitting.

Вместо одного жирного запроса EF разбивает его на несколько аккуратных. Без дублирования, без раздувания результата, без боли.
Одна настройка - и ты экономишь кучу ресурсов на проде.

P.S. Если работаешь с EF Core - такие нюансы решают, будет ли твой сервис летать или умирать под нагрузкой.

Читать полностью…

C# (C Sharp) programming

🔥 Не понимаешь, что происходит внутри .NET приложения

Значит у тебя нет нормальной трассировки

Минимальный сетап, который стоит добавить почти в любой проект

OpenTelemetry с базовой инструментализацией
ASP.NET Core, HttpClient, EF Core, Redis и база через Npgsql или SqlClient

Этого хватает, чтобы видеть полный путь запроса
от входа в API до базы и внешних сервисов

Дальше всё становится прозрачным
• где тормозит
• где падает
• где утекает время

Для визуализации можно подключить любой стек

• Aspire Dashboard под быстрый старт
• Grafana если нужен прод уровень
• Jaeger для классического трейсинга
• Seq если хочешь объединить логи и трейсы

Seq особенно удобен, потому что нормально работает со структурированными логами

По факту это один из самых дешёвых апгрейдов инфраструктуры, а профит даёт сразу

Гайд

Читать полностью…

C# (C Sharp) programming

🌟 Микросервисы - это не про то, чтобы в первый же день распилить приложение на десятки сервисов.

Ключевая идея — независимая эволюция.

Каждый сервис:
— владеет своей предметной областью
— хранит свои данные
— разворачивается независимо

Именно отсюда появляются реальные плюсы:

— команды двигаются быстрее
— релизы становятся безопаснее
— система становится устойчивее к сбоям

Но есть и обратная сторона:

— растёт сложность
— появляется больше координации между командами
— сложнее поддерживать консистентность данных

Микросервисы — это не «серебряная пуля».
Это обмен: гибкость и скорость ↔ сложность и операционные расходы.

Поэтому перед тем как идти в эту архитектуру — важно понять базу.

Разбор ключевых концепций и нюансов

Читать полностью…

C# (C Sharp) programming

🔥 Парень без опыта навайбкодил клон Warcraft с помощью ИИ - индустрия, ты как там?

Обычный парень просто накидывал идеи в Claude и получил полноценную браузерную стратегию.

Что в итоге:

• 9 фракций, ~200 уникальных юнитов
• 50 заклинаний и 70 зданий
• 150 треков, тысячи спрайтов и реплик
• Прокачка с древами развития
• Магия, гарнизоны, торговля, туман войны
• Генерация карт на лету

И это ещё не всё:

• PvP с игроками
• PvE против ИИ (3 уровня сложности)
• Наблюдение за боями ИИ vs ИИ
• Голосовое управление армией
• Работает в браузере — ПК, телефон, планшет

Без регистрации. Просто заходишь в гостевой режим и играешь.

https://www.shardsofstone.com/

Читать полностью…

C# (C Sharp) programming

⚙️ Как правильно работать с настройками в .NET?

В .NET есть 3 основных интерфейса для конфигурации.
И если выбрать не тот — приложение может просто игнорировать изменения в настройках.

Разбираем просто 👇

1️⃣ IOptions
- читается один раз при запуске
- кэшируется на всё время жизни приложения
- подходит для статических настроек

2️⃣ IOptionsSnapshot
- пересчитывается на каждый запрос
- подхватывает изменения в appsettings.json без перезапуска
- идеален для Web API (Scoped)

3️⃣ IOptionsMonitor
- обновляется в реальном времени
- триггерит событие при изменении настроек
- подходит для фоновых сервисов (Singleton)

Главное правило:

👉 статические настройки → IOptions
👉 веб-приложения → IOptionsSnapshot
👉 фоновые сервисы с реакцией на изменения → IOptionsMonitor

Если используешь не тот интерфейс — можешь долго не понимать, почему конфиг не обновляется.

А это одна из самых частых и незаметных ошибок в .NET.

Подробнее

Читать полностью…

C# (C Sharp) programming

Как за 2 года стать разработчиком, за которого конкурируют компании?

⚡️ 8 апреля ИТМО в партнёрстве с Яндекс Практикумом проведут День открытых дверей онлайн-магистратуры «Фронтенд- и бэкенд-разработка».

Поговорим про фронтенд и бэкенд, разницу между ними и уровень знаний на старте. Обсудим, какие навыки нужны для поступления, как магистратура помогает быстрее выйти на рынок — и быть на нём конкурентоспособным.

Отдельно разберём сценарии для тех, кто уже работает в IT: как сменить стек, углубиться в текущий или перейти в новые направления, включая работу с ИИ.

На встрече обсудим:
— какой трек выбрать и как выстроить карьеру в разработке
— какую роль играет ИИ в программировании
— как устроена программа и чему вы научитесь
— как проходит обучение и как его совмещать с работой
— как поступить: вступительные испытания и ключевые даты


Подключайтесь онлайн 8 апреля в 19:00 мск.

→ Зарегистрироваться на ДОД

Читать полностью…

C# (C Sharp) programming

☁️ Как на самом деле устроены инфраструктурные сервисы Yandex Cloud?

Разработчики Yandex Cloud и Yandex Infrastructure расскажут об этом 16 апреля на встрече для разработчиков, архитекторов и сетевых инженеров.

В программе вас ждут реальные технические варианты реализации и опыт нетривиальных решений разработчиков платформы:

— Инфраструктура как код для управления оповещениями: и никаких проблем
— Развёртывание в ритме танго: как мы заменили оркестрацию процесса установки «хореографией»
— Как мы оптимизируем вывод больших языковых моделей: кэширование, время отклика и ресурсы графических ускорителей
— Как мы строили собственный сервис доставки контента и через что нам пришлось пройти?
— Как мы работаем с уязвимостями на примере современных атак
— Секретный доклад (онлайн трансляция не предусмотрена)

Участники смогут обсудить самые “горячие” вопросы, технические варианты реализации и ошибки с разработчиками сервисов Yandex Cloud и другими участниками.

Когда: 16 апреля офлайн в Москве и онлайн.
Помимо экспертных докладов, офлайн участников ждут развлекательная программа, а тех, кто онлайн: инженерное соревнование в прямом эфире.

Регистрируйтесь, чтобы послушать реальные истории от разработчиков, обменяться опытом и узнать, что скрыто под «капотом» инфраструктурных сервисов, а также какие планы у команды на будущее.

Читать полностью…

C# (C Sharp) programming

👩‍💻 Открытый урок «Производительность кода на примере алгоритмов сортировки»

🗓 21 апреля в 20:00 МСК

🆓 На этом открытом уроке мы разберёмся, как скорость работы программы зависит от выбранного способа решения задачи - на понятном примере сортировки данных

🔍 Что вы узнаете на вебинаре:
• Почему существует несколько способов выполнить одну и ту же задачу
• Как разные подходы к сортировке данных влияют на скорость работы программы
• Почему одни решения подходят для маленьких объёмов данных, а другие — для больших
• Что происходит с программой, когда данных становится в 10, 100 или 1000 раз больше

🎯 Кому будет полезно:
• Тем, кто только присматривается к профессии разработчика на C#
• Новичкам, которые начали изучать C# и хотят понимать, как писать «быстрый» код
• Всем, кто хочет разобраться, от чего зависит скорость работы приложений

🔗 Ссылка на регистрацию: https://otus.pw/GAHM/?erid=2W5zFGdMqeZ

Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.

Читать полностью…

C# (C Sharp) programming

👩‍💻 Открытый урок «Как работают структуры данных C# "под капотом"»

🗓 13 апреля в 20:00 МСК

🆓 На этом открытом уроке мы простым и понятным языком разберём структуры данных, что происходит внутри программы, когда она хранит и обрабатывает данные.

Что рассмотрим на вебинаре:
✔ Внутреннее устройство ключевых коллекций
✔ Принципы работы и алгоритмическую сложность операций
✔ Особенности реализации, влияющие на производительность

Кому будет полезно:
✔ Начинающим разработчикам - чтобы углубить понимание платформы .NET и писать эффективный, надёжный код.
✔ Тем, кто готовится к техническим собеседованиям (вопросы о внутреннем устройстве коллекций и сложности операций - классика интервью).
✔ Всем, кто хочет осознанно выбирать структуры данных - избегать типичных ошибок, понимать компромиссы и узкие места.

🔗 Ссылка на регистрацию: https://otus.pw/HE4y/?erid=2W5zFJNNR7F

Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.

Читать полностью…

C# (C Sharp) programming

Vector Search - как это работает (и почему это важно для .NET разработчиков)

Vector search ищет смысловую близость, а не просто точные совпадения.

Он сравнивает данные - текст, изображения или аудио - используя векторные эмбеддинги в многомерном пространстве.

То есть система ищет не одинаковые слова, а похожие по смыслу объекты.

Почему это важно?

Vector search лежит в основе многих AI-функций:

- семантический поиск
- рекомендательные системы
- интеграции с LLM
- умные ассистенты внутри приложений

Добавив векторный поиск в приложение, разработчик может создавать намного более умные продукты, которые понимают смысл запросов пользователя.

Это дает реальную бизнес-ценность - от поиска по документам до персонализированных рекомендаций.

📍 Полный пример реализации

🚀 Max

Читать полностью…

C# (C Sharp) programming

Есть более эффективный способ делать массовые обновления в EF Core.

Начиная с EF Core 7 появился метод ExecuteUpdate, который позволяет обновлять записи напрямую на стороне базы данных.

Вместо того чтобы загружать объекты в память, изменять их в цикле и затем вызывать SaveChanges, можно выполнить обновление одним SQL-запросом.

Это значительно быстрее и снижает нагрузку на приложение, особенно при работе с большими таблицами.

Однако есть важное условие: нужно заранее знать, какое поле вы обновляете и какое значение ему присваиваете, поскольку операция формируется как прямой SQL-update.

Такой подход отлично подходит для массовых операций и оптимизации производительности в EF Core.

Читать полностью…

C# (C Sharp) programming

Как меняется роль разработчика в 2026 году?

AI стремительно меняет то, как создаются продукты и пишется код. Всё чаще обсуждают не только новые инструменты, но и более фундаментальный вопрос: какой будет роль разработчика в ближайшие годы.

24 марта Mindbox проводит открытые дебаты, где эксперты по AI из SberDevices и Itsy обсудят, куда движутся технологии и как это влияет на работу инженеров.

Что будет на встрече:

— разговор о том, как на AI смотрят с двух сторон: со стороны бизнеса и со стороны разработки
— возможность задать свои вопросы и обсудить их прямо во время дебатов
— реальные идеи и практики, которые уже используют команды

Если вам интересно, как меняется индустрия и какие навыки будут важны дальше — подключайтесь и приносите свои вопросы.

Канал Сергея Маркова
Канал Никиты Архипова

📅 24 марта
⏰ 19:00–20:30 мск
📍 Онлайн, бесплатно

👉 Зарегистрироваться

Реклама. ООО «Майндбокс», ИНН: 7713688880, erid: 2W5zFGn2zp1

Читать полностью…

C# (C Sharp) programming

⚡️ Exceptions - это для действительно исключительных ситуаций.

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

Самый удобный способ в ASP.NET Core - сделать глобальный обработчик через middleware:

- перехватываем любые необработанные исключения
- логируем ошибку
- возвращаем клиенту единый JSON-ответ (ProblemDetails) с 500

Пример:


public class ExceptionHandlingMiddleware
{
private readonly RequestDelegate _next;
private readonly ILogger<ExceptionHandlingMiddleware> _logger;

public ExceptionHandlingMiddleware(
RequestDelegate next,
ILogger<ExceptionHandlingMiddleware> logger)
{
_next = next;
_logger = logger;
}

public async Task InvokeAsync(HttpContext context)
{
try
{
await _next(context);
}
catch (Exception exception)
{
_logger.LogError(
exception, "Exception occurred: {Message}", exception.Message);

var problemDetails = new ProblemDetails
{
Status = StatusCodes.Status500InternalServerError,
Title = "Server Error"
};

context.Response.StatusCode =
StatusCodes.Status500InternalServerError;

await context.Response.WriteAsJsonAsync(problemDetails);
}
}
}

Читать полностью…

C# (C Sharp) programming

💡 Soft delete в EF Core без лишней логики в сервисах

Удалять данные физически — не всегда хорошая идея.
Логи, аудит, восстановление, аналитика — всё это требует soft delete.

Вот удобный способ реализовать его через EF Core interceptor.

Что делает перехватчик:

- Проверяет ChangeTracker на сущности с интерфейсом ISoftDeletable
- Если состояние сущности — Deleted
- Меняет его на Modified
- Устанавливает:
- IsDeleted = true
- DeletedOnUtc = DateTime.UtcNow

В итоге:

Вы вызываете обычный:


context.Remove(entity);


А в базе:

- запись не удаляется
- просто помечается как удалённая

Плюсы подхода:

- никакой логики soft delete в сервисах и репозиториях
- единая точка обработки
- чистый доменный код
- безопасное удаление по всему приложению

Важно:

Если у вас есть связанные сущности (navigation properties),
перехватчик нужно дополнительно расширить — каскадное soft-удаление EF Core не делает автоматически.

Soft delete через interceptor — это один из самых чистых production-подходов для EF Core.

#dotnet #EFCore #Backend #Architecture #CSharp

Читать полностью…

C# (C Sharp) programming

Динамическая строка подключения в EF Core - когда и зачем это нужно

Факт
В EF Core можно задать connection string динамически при регистрации DbContext. Для этого используется делегат, который выполняется в момент получения контекста из DI.

Как это работает

При регистрации DbContext вы передаёте функцию, которая получает IServiceProvider.
Внутри неё можно:
- получить любой сервис
- определить текущего пользователя или tenant
- выбрать нужную базу данных
- и только после этого установить строку подключения

Пример


builder.Services.AddDbContext<OrdersDbContext>((sp, o) =>
{
var tenantProvider = sp.GetRequiredService<TenantProvider>();
var connectionString = tenantProvider.GetConnectionString();

o.UseSqlServer(connectionString);
});


Dynamic DbContext configuration - ключевой паттерн для масштабируемых multi-tenant систем.
Если приложение растёт и базы начинают разделяться по клиентам или регионам, этот подход становится стандартом архитектуры.

Читать полностью…
Subscribe to a channel