YDB Entity Framework Core Provider

YDB предоставляет поставщика Entity Framework (EF) Core — объектно-реляционный модуль сопоставления (ORM), который позволяет разработчикам .NET работать с базой данных YDB с помощью объектов .NET. Он ведёт себя так же, как и другие поставщики EF Core (например, SQL Server), поэтому здесь применима общая документация по EF Core. Если вы только начинаете работать с EF Core, эта документация — лучшее место для начала.

Разработка EF Core Provider ведётся в открытом GitHub репозитории, о всех проблемах следует сообщать там.

Настройка поставщика YDB Entity Framework Core

Чтобы начать работу, необходимо добавить необходимые пакеты NuGet в свой проект:

dotnet add package EntityFrameworkCore.Ydb

Определение моделей и DbContext

Допустим, вы хотите хранить блоги и их записи в своей базе данных; вы можете смоделировать их как типы .NET следующим образом:

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }

    public List<Post> Posts { get; set; }
}

public class Post
{
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

    public int BlogId { get; set; }
    public Blog Blog { get; set; }
}

Затем вы определяете DbContext, который будете использовать для взаимодействия с базой данных:

Использование OnConfiguring() для настройки контекста — самый простой способ начать работу, но для большинства приложений в рабочей среде он не рекомендуется:

public class BloggingContext : DbContext
  {
  public DbSet<Blog> Blogs { get; set; }
  public DbSet<Post> Posts { get; set; }
  
      protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
          => optionsBuilder.UseYdb("<connection string>");
  }
  
  // At the point where you need to perform a database operation:
  using var context = new BloggingContext();
  // Use the context...
var dbContextFactory = new PooledDbContextFactory<BloggingContext>(
  new DbContextOptionsBuilder<BloggingContext>()
      .UseYdb("<connection string>")
      .Options);

// At the point where you need to perform a database operation:
using var context = dbContextFactory.CreateDbContext();
// Use the context...
var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContextPool<BloggingContext>(opt =>
    opt.UseYdb(builder.Configuration.GetConnectionString("BloggingContext")));

public class BloggingContext(DbContextOptions<BloggingContext> options) : DbContext(options)
{
    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }
}

Для получения дополнительной информации о начале работы с EF обратитесь к документации по началу работы.

Дополнительные конфигурации YDB

Поставщик Entity Framework (EF) Core для YDB имеет собственные дополнительные параметры конфигурации.

Подключение ADO.NET к Yandex Cloud

Подробнее ознакомиться с различными способами аутентификации в Yandex Cloud можно в документации по ADO.NET.

Ниже приведён пример того, как передать необходимые параметры для подключения к Yandex Cloud в Entity Framework:

.UseYdb(cmd.ConnectionString, builder => builder
    .WithCredentialsProvider(saProvider)
    .WithServerCertificates(YcCerts.GetYcServerCertificates())
)

Миграция схемы

Для корректного выполнения миграций схемы базы данных необходимо отключить стратегию автоматического повтора запросов (ExecutionStrategy), которая по умолчанию активирована в пакете EntityFrameworkCore.Ydb.

Чтобы отключить ExecutionStrategy при выполнении миграций, следует явно переопределить интерфейс IDesignTimeDbContextFactory и воспользоваться методом DisableRetryOnFailure().

Пример реализации фабрики контекста данных для миграций:

internal class BloggingContextFactory : IDesignTimeDbContextFactory<BloggingContext>
{
    public BloggingContext CreateDbContext(string[] args)
    {
        var optionsBuilder = new DbContextOptionsBuilder<BloggingContext>();

        return new BloggingContext(
            optionsBuilder.UseYdb("Host=localhost;Port=2136;Database=/local",
                builder => builder.DisableRetryOnFailure()
            ).Options
        );
    }
}

Примечание

Объект фабрики потребуется для выполнения команд миграции, например:

dotnet ef migrations add MyMigration  
dotnet ef database update

Примеры

Полные примеры использования доступны на GitHub.

Предыдущая
Следующая