Start Debugging

Queryable Encryption и векторный поиск в провайдере MongoDB EF Core (и почему это важно для .NET 9 и .NET 10)

Провайдер MongoDB EF Core теперь поддерживает Queryable Encryption и векторный поиск. Что это значит для приложений на .NET 9 и .NET 10, уже использующих EF Core.

7 января 2026 года Microsoft опубликовала приятное обновление, в котором безопасность встречается с поиском: провайдер MongoDB EF Core теперь поддерживает Queryable Encryption (равенство и диапазон) и векторный поиск через LINQ-поверхность в стиле EF Core. Если ваше приложение на .NET 9 или .NET 10 уже свободно говорит на EF Core, это одна из тех функций, которые могут уменьшить количество “специального MongoDB-кода”, протекающего в ваш доменный слой.

Зашифрованные запросы, которые по-прежнему похожи на LINQ

Queryable Encryption интересна тем, что это не просто “шифрование на диске”. Суть в том, что вы по-прежнему можете выражать предикаты равенства и диапазона, оставляя чувствительные поля зашифрованными.

Маппинг задаётся явно в OnModelCreating. В посте показана конфигурация шифрования так:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Employee>(entity =>
    {
        entity.Property(e => e.TaxPayerId)
            .IsEncryptedForEquality(<Your Data Encryption Key GUID>));

        entity.Property(e => e.Salary)
            .HasBsonRepresentation(BsonType.Decimal128)
            // Salaries from 0 to 10 million, no decimal place precision
            .IsEncryptedForRange(0m, 10000000m, 0,
                <Your Data Encryption Key GUID>));              
    });
}

После маппинга запросы читаются как обычные запросы EF Core:

// Encrypted Equality Query
var specificEmployee = db.Employees.Where(e => e.TaxPayerId == "45678");

// Encrypted Range Query
var seniorEmployees = db.Employees.Where(e => e.Salary >= 100000m && e.Salary < 200000m);

Главный выигрыш — архитектурный: намерение запроса остаётся видимым в код-ревью (кто фильтрует по зарплате, кто сопоставляет по налоговому идентификатору) без того, чтобы по приложению расползалась ad hoc-обвязка шифрования.

Векторный поиск из вашего DbContext

Векторный поиск появляется повсюду, потому что поиск смещается от совпадений по ключевым словам к совпадениям по сходству. Провайдер добавляет маппинг для векторных полей и API запроса векторного поиска.

Из поста DevBlogs: вы маппите массив float как бинарный вектор:

b.Property(e => e.PlotEmbedding)
   .HasElementName("plot_embedding_voyage_3_large")
   .HasBinaryVectorDataType(BinaryVectorDataType.Float32);

// OR in the model:
[BinaryVector(BinaryVectorDataType.Float32)]
public float[]? PlotEmbedding { get; set; }

Затем можно делать запрос по сходству:

var similarMovies = await db.Movies.VectorSearch(
        e => e.PlotEmbedding,
        myCustom.PlotEmbedding,
        limit: 10)
    .ToListAsync();

Если вы строите на .NET 9 или .NET 10, это позволяет держать логику “рекомендаций/поиска” ближе к существующим паттернам EF Core, при меньшем числе кастомных пайплайнов запросов, которые приходится сопровождать.

Если хочется полного контекста и деталей провайдера, прочитайте оригинальный пост: Secure and Intelligent: Queryable Encryption and Vector Search in MongoDB EF Core Provider.

Comments

Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.

< Назад