
Привет, Хабр! Меня зовут Сергей Сорокин, я .NET-разработчик с 12-летним стажем. Занимаюсь бэкендом, архитектурой и высокими нагрузками.
Проблема стандартных ORM
Знаю, о чем вы подумали, прочитав заголовок: «О боже, еще одна ORM? В 2025 году? Зачем, если есть Dapper и EF Core?»
Но когда ты работаешь в Enterprise-системах, где производительность критична, а база данных — это не просто хранилище, а мощный инструмент обработки данных, стандартные решения начинают показывать свои слабые места.
Философия: База данных как API
Сегодня я хочу рассказать о Visor — ORM, которую мы создали, чтобы превратить работу с базой данных в вызов типизированного API, убрать оверхед рефлексии и решить извечную боль с передачей списков (TVP) в SQL Server.
Мы пришли к концепции, где База данных выступает как сервис (API). Endpoint — это хранимая процедура или функция. Contract — это сигнатура процедуры и Table-Valued Parameters (TVP) или композитные типы (Postgres).
Почему Dapper и EF Core нам не подошли?
Мы искали инструмент, который сочетал бы удобство интерфейсов (как Refit для HTTP) и максимальную производительность (как ручной ADO.NET).
Претензия к Dapper
- «Черный ящик» и боль с TVP
- Runtime Reflection: Вся магия маппинга происходит в рантайме через IL Emit.
- Table-Valued Parameters (TVP): Это главная боль.
Претензия к EF Core
- Слишком тяжелый
- Overhead: ChangeTracker, построение графов, Snapshots.
Visor: Концепция «White Box» (Прозрачный ящик)
Так родился Visor. Главная идея — Source Generators. Мы переносим всю работу по созданию SQL-команд, параметров и маппингу результатов с этапа выполнения (Runtime) на этап компиляции (Compile Time).
Киллер-фича: Zero Allocation TVP Streaming
Самое интересное — как мы реализовали передачу списков. Вместо создания DataTable (как это делают почти все), генератор создает код, который использует IEnumerable
Бенчмарки: Момент истины
Мы сравнили вставку 10 000 записей в MS SQL Server через процедуру с TVP.
- Visor (TVP Streaming)
- EF Core 10 (Bulk Insert / AddRange)
- Dapper (Стандартная вставка в цикле / Execute)
Результаты (BenchmarkDotNet):
- Visor быстрее EF Core в 10 раз.
- Visor быстрее Dapper (loop) в 800 раз.
Итоги
Мы создали инструмент не для того, чтобы «убить» EF Core или Dapper. Мы создали его для конкретной ниши: High-Load Enterprise системы, где база данных используется на полную мощность через хранимые процедуры.
Что дает Visor:
- Скорость: Работает на уровне ручного ADO.NET.
- Надежность: Строгая типизация и валидация схемы на этапе компиляции.
- Чистота: Ваш код не зависит от деталей реализации доступа к данным.
- Мульти-провайдерность: Сейчас поддерживается MSSQL и PostgreSQL.
Проект полностью Open Source. Если вам близок подход «Database as an API» или вы просто хотите посмотреть, как работают Source Generators в .NET 10 — добро пожаловать в репозиторий.







