Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 582новые вакансии за сутки·92 562вакансии открыты сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании7 220
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 402 кандидата открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python17 105
  • Облачные технологии14 068
  • QA вакансии3 460
  • Backend вакансии2 098
  • Инженер данных1 796
  • Продакт-менеджер1 248

Разработка

  • Android1 866
  • iOS1 699
  • Fullstack вакансии979
  • AI вакансии951
  • Frontend вакансии742
  • Mobile вакансии44

По стеку

  • Go8 651
  • Java6 544
  • Node.js2 018
  • .NET1 719
  • Kotlin1 623
  • Rust1 453
  • C#709
  • PHP683
  • C++571

DevOps и инфраструктура

  • Kubernetes7 761
  • DevOps вакансии6 057
  • Linux-инфраструктура5 492
  • Terraform / IaC4 259
  • CI/CD3 240
  • Мониторинг и Observability1 782
  • SRE565
  • Кибербезопасность450

Аналитика и данные

  • Data Scientist1 127
  • Бизнес-аналитик925
  • Аналитик данных845
  • Системный аналитик154

Другие направления

  • Проджект-менеджер611
  • UI/UX дизайн145
  • Ручное тестирование14

По регионам

  • Вакансии в США43 686
  • Вакансии в Европе23 668
  • Вакансии в Канаде4 413
  • Работа в России3 909

По формату

  • Удалённые вакансии73 889
  • Релокация в США43 686
  • Гибридная работа12 392
  • Офисная работа7 088

По уровню

  • Senior вакансии42 236
  • Middle вакансии20 545
  • Junior вакансии6 653

Сейчас нанимают

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab138 вакансий
  • Celonis39 вакансий
  • Spotify36 вакансий
  • Adyen29 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace16 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме Entity FrameworkВсе вопросы
Entity FrameworkMiddleКодинг

Что такое value converters в EF Core и как их использовать?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

Value converters преобразуют значения свойств между CLR-типом модели и типом, хранимым в БД. Настраиваются через HasConversion() в OnModelCreating или через атрибут [ValueConverter]. Встроенные конвертеры: EnumToStringConverter, DateTimeToTicksConverter и другие.

Базовое использование: HasConversion

// Хранение enum как строки вместо int
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder
        .Entity<Order>()
        .Property(o => o.Status)
        .HasConversion(
            v => v.ToString(),          // CLR → DB: "Pending", "Shipped"
            v => Enum.Parse<OrderStatus>(v) // DB → CLR
        );
}

Value Converters в EF Core

Value converter — это пара функций: toProvider (из CLR → БД) и fromProvider (из БД → CLR). EF Core применяет их автоматически при чтении и записи данных. Это позволяет хранить сложные типы в простых столбцах БД без изменения схемы или модели домена.

Встроенные конвертеры

EF Core предоставляет готовые конвертеры в пространстве имён Microsoft.EntityFrameworkCore.Storage.ValueConversion:

using Microsoft.EntityFrameworkCore.Storage.ValueConversion;

modelBuilder
    .Entity<Order>()
    .Property(o => o.Status)
    .HasConversion(new EnumToStringConverter<OrderStatus>());

// Другие встроенные:
// BoolToZeroOneConverter<int>   — bool → 0/1
// DateTimeToTicksConverter       — DateTime → long
// DateTimeOffsetToBinaryConverter
// TimeSpanToTicksConverter
// GuidToBytesConverter

Пользовательский конвертер (класс)

Для переиспользования конвертер выносят в отдельный класс, наследующий ValueConverter<TModel, TProvider>.

public class MoneyConverter : ValueConverter<decimal, long>
{
    public MoneyConverter() : base(
        v => (long)(v * 100),       // рубли → копейки в БД
        v => v / 100m               // копейки → рубли в CLR
    ) { }
}

// Применение:
modelBuilder
    .Entity<Product>()
    .Property(p => p.Price)
    .HasConversion(new MoneyConverter());

Хранение объекта как JSON-строки

Полезно для Value Object или сложной структуры без отдельной таблицы.

public class Address
{
    public string Street { get; set; } = string.Empty;
    public string City   { get; set; } = string.Empty;
    public string Zip    { get; set; } = string.Empty;
}

var addressConverter = new ValueConverter<Address, string>(
    v => JsonSerializer.Serialize(v, (JsonSerializerOptions?)null),
    v => JsonSerializer.Deserialize<Address>(v, (JsonSerializerOptions?)null)!
);

modelBuilder
    .Entity<Customer>()
    .Property(c => c.ShippingAddress)
    .HasConversion(addressConverter)
    .HasColumnType("text"); // явно укажите тип столбца

Применение конвертера ко всем свойствам типа

EF Core 6+ позволяет зарегистрировать конвертер глобально для всех свойств определённого типа.

protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder)
{
    configurationBuilder
        .Properties<OrderStatus>()
        .HaveConversion<EnumToStringConverter<OrderStatus>>();

    // Или для кастомного типа:
    configurationBuilder
        .Properties<decimal>()
        .HaveConversion<MoneyConverter>();
}

ValueComparer — обязателен для изменяемых типов

EF Core отслеживает изменения через сравнение значений. Для изменяемых типов (списков, объектов) необходимо предоставить ValueComparer, иначе EF Core не заметит изменений внутри объекта.

var listConverter = new ValueConverter<List<string>, string>(
    v => string.Join(',', v),
    v => v.Split(',', StringSplitOptions.RemoveEmptyEntries).ToList()
);

var listComparer = new ValueComparer<List<string>>(
    (c1, c2) => c1!.SequenceEqual(c2!),
    c => c.Aggregate(0, (a, v) => HashCode.Combine(a, v.GetHashCode())),
    c => c.ToList() // снимок для change tracking
);

modelBuilder
    .Entity<Tag>()
    .Property(t => t.Aliases)
    .HasConversion(listConverter, listComparer);

Подводные камни

  • LINQ-фильтрация в БД может не работать — EF Core не всегда транслирует предикаты на конвертированных свойствах в SQL; проверяйте, что запрос не уходит в memory-evaluation (EnableSensitiveDataLogging + логи).
  • Без ValueComparer изменяемые объекты не отслеживаются — EF Core не обнаружит изменение поля внутри сложного объекта без явного компаратора.
  • Nullable-типы требуют явной обработки null — если свойство nullable, добавьте null-проверку в лямбды конвертера, иначе получите NullReferenceException при чтении NULL из БД.
  • Тип столбца не определяется автоматически — при хранении объекта как JSON укажите .HasColumnType("text") или "nvarchar(max)", иначе провайдер выберет неоптимальный тип.
  • HasConversion переопределяет ColumnType — указывайте HasColumnType после HasConversion, а не до.
  • Конвертер не работает с raw SQL — при использовании ExecuteSqlRaw или Dapper значения передаются напрямую без конвертации EF Core.
  • Производительность JSON-сериализации — конвертеры вызываются при каждом чтении/записи строки; для горячих путей используйте кэширование JsonSerializerOptions.

Частые вопросы на собеседовании

  • Как предотвратить проблему N+1 запросов в Entity Framework?
  • Как работают migration в EF Core? Как создавать и применять их?
  • В чём разница между eager loading, lazy loading и explicit loading?
  • Как сравнить Entity Framework с raw SQL, query builder и другими ORM по контролю, типобезопасности и производительности?

Типичные ошибки

  • Путать value converters и преобразование CLR/DB типов с похожим механизмом из другой версии или платформы.
  • Игнорировать runtime-границы Entity Framework: lifecycle, DI scope, SQL translation, UI thread или platform API.
  • Не обсуждать null/empty/error cases и поведение под нагрузкой.

Что проверяет интервьюер

  • Кандидат объясняет value converters и преобразование CLR/DB типов на конкретном примере, а не только определением.
  • Указывает последствия для производительности, тестируемости и поддержки.
  • Различает документированное поведение текущего стека и устаревшие практики.

Как вы знаете этот вопрос?

Проверить себя по теме Entity Framework →

Источники

  • https://learn.microsoft.com/en-us/ef/core/modeling/value-conversions
←Предыдущий вопросРасскажите о случае, когда Entity Framework помог или помешал вам при миграциях, транзакциях, оптимизации запросов или борьбе с N+1.Следующий вопрос→Когда использовать `AsNoTracking`, compiled queries и split queries?

Связанные темы

Entity Frameworkdata-access-designimplementationruntime-reasoning