» » » » Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен

Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен

На нашем литературном портале можно бесплатно читать книгу Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен, Эндрю Троелсен . Жанр: Программирование. Онлайн библиотека дает возможность прочитать весь текст и даже без регистрации и СМС подтверждения на нашем литературном портале litmir.org.
Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен
Название: Язык программирования C#9 и платформа .NET5
Дата добавления: 22 август 2024
Количество просмотров: 285
Читать онлайн

Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних просмотр данного контента СТРОГО ЗАПРЕЩЕН! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту readbookfedya@gmail.com для удаления материала

Язык программирования C#9 и платформа .NET5 читать книгу онлайн

Язык программирования C#9 и платформа .NET5 - читать бесплатно онлайн , автор Эндрю Троелсен

В 10-м издании книги описаны новейшие возможности языка C# 9 и .NET 5 вместе с подробным "закулисным" обсуждением, призванным расширить навыки критического мышления разработчиков, когда речь идет об их ремесле.
Книга охватывает ASP.NET Core, Entity Framework Core и многое другое наряду с последними обновлениями унифицированной платформы .NET, начиная с улучшений показателей производительности настольных приложений Windows в .NET 5 и обновления инструментария XAML и заканчивая расширенным рассмотрением файлов данных и способов обработки данных.
Все примеры кода были переписаны с учетом возможностей последнего выпуска C# 9.

Перейти на страницу:
add AutoLot.Samples package Microsoft.EntityFrameworkCore.Design

dotnet add AutoLot.Samples package Microsoft.EntityFrameworkCore.SqlServer

Класс DbContext

Класс DbContext входит в состав главных компонентов EF Core и предоставляет доступ к базе данных через свойство Database. Объект DbContext управляет экземпляром ChangeTracker, поддерживает виртуальный метод OnModelCreating() для доступа к текучему API-интерфейсу (Fluent API), хранит все свойства DbSet<T> и предлагает метод SaveChanges(), позволяющий сохранять данные в хранилище. Он применяется не напрямую, а через специальный класс, унаследованный от DbContext. Именно в этом классе размещены все свойства типа DbSet<T>. В табл. 22.1 описаны некоторые часто используемые члены класса DbContext.

Создание класса, производного от DbContext

Первый шаг в EF Core заключается в создании специального класса, унаследованного от DbContext. Затем добавляется конструктор, который принимает строго типизированный экземпляр DbContextOptions (рассматривается далее) и передает его конструктору базового класса:

namespace AutoLot.Samples

{

  public class ApplicationDbContext : DbContext

  {

    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)

            : base(options)

    {

    }

  }

}

Именно производный от DbContext класс применяется для доступа к базе данных и работает с сущностями, средством отслеживания изменений и всеми компонентами EF Core.

Конфигурирование экземпляра DbContext

Экземпляр DbContext конфигурируется с использованием экземпляра класса DbContextOptions. Экземпляр DbContextOptions создается с применением DbContextOptionsBuilder, т.к. класс DbContextOptions не рассчитан на создание экземпляров непосредственно в коде. Через экземпляр DbContextOptionsBuilder выбирается поставщик базы данных (наряду с любыми настройками, касающимися поставщика) и устанавливаются общие параметры экземпляра DbContext инфраструктуры EF Core (наподобие ведения журнала). Затем свойство Options внедряется в базовый класс DbContext во время выполнения.

Такая возможность динамического конфигурирования позволяет изменять настройки во время выполнения, просто выбирая разные параметры (скажем, поставщик MySQL вместо SQL Server) и создавая новый экземпляр производного класса DbContext.

Фабрика DbContext этапа проектирования

Фабрика DbContext этапа проектирования представляет собой класс, который реализует интерфейс IDesignTimeDbContextFactory<T>, где Т — класс, производный от DbContext. Интерфейс IDesignTimeDbContextFactory<T> имеет один метод CreateDbContext(), который должен быть реализован для создания экземпляра производного класса DbContext.

В показанном ниже классе ApplicationDbContextFactory с помощью метода CreateDbContext() создается строго типизированный экземпляр DbContextOptionsBuilder для класса ApplicationDbContext, устанавливается поставщик баз данных SQL Server (с использованием строки подключения к экземпляру Docker из главы 21), после чего создается и возвращается новый экземпляр ApplicationDbContext:

using System;

using Microsoft.EntityFrameworkCore;

using Microsoft.EntityFrameworkCore.Design;

namespace AutoLot.Samples

{

   public class ApplicationDbContextFactory : IDesignTimeDbContextFactory

<ApplicationDbContext>

  {

   public ApplicationDbContext CreateDbContext(string[] args)

    {

      var optionsBuilder = new DbContextOptionsBuilder<ApplicationDbContext>();

       var connectionString =

         @"server=.,5433;Database=AutoLotSamples;

         User Id=sa;Password=P@ssw0rd;";

      optionsBuilder.UseSqlServer(connectionString);

      Console.WriteLine(connectionString);

      return new ApplicationDbContext(optionsBuilder.Options);

    }

  }

}

Интерфейс командной строки задействует фабрику контекстов, чтобы создать экземпляр производного класса DbContext, предназначенный для выполнения действий вроде создания и применения миграций базы данных. Поскольку фабрика является конструкцией этапа проектирования и не используется во время выполнения, строка подключения к базе данных разработки обычно будет жестко закодированной. В версии EF Core 5 появилась возможность передавать методу CreateDbContext() аргументы из командной строки, о чем пойдет речь позже в главе.

Метод OnModelCreating()

Базовый класс DbContext открывает доступ к методу OnModelCreating(), который применяется для придания формы сущностям, используя Fluent API. Детали подробно раскрываются далее в главе, а пока добавьте в класс ApplicationDbContext следующий код:

protected override void OnModelCreating(ModelBuilder modelBuilder)

{

  // Обращения к Fluent API.

  OnModelCreatingPartial(modelBuilder);

}

partial void OnModelCreatingPartial(ModelBuilder modelBuilder);

Сохранение изменений

Чтобы заставить DbContext и ChangeTracker сохранить любые изменения, внесенные в отслеживаемые сущности, вызовите метод SaveChanges() (или SaveChangesAsync()) на экземпляре класса, производного от DbContext:

static void SampleSaveChanges()

{

  // Фабрика не предназначена для такого использования,

  // но это демонстрационный код

    var context = new ApplicationDbContextFactory().CreateDbContext(null);

    // Внести какие-нибудь изменения.

    context.SaveChanges();

}

В оставшемся материале главы (и книги) вы обнаружите много примеров сохранения изменений.

Поддержка транзакций и точек сохранения

Исполняющая среда EF Core помещает каждый вызов SaveChanges()/SaveChangesAsync() внутрь неявной транзакции, использующей уровень изоляции базы данных. Чтобы добиться большей степени контроля, можете включить экземпляр производного класса DbContext в явную транзакцию. Для выполнения явной транзакции создайте транзакцию с применением свойства Database класса, производного от DbContext. Управляйте своими операциями обычным образом и затем предпримите фиксацию или откат транзакции. Ниже приведен фрагмент кода, где все демонстрируется:

using var trans = context.Database.BeginTransaction();

try

{

  // Создать, изменить, удалить запись.

  context.SaveChanges();

  trans.Commit();

}

catch (Exception ex)

{

  trans.Rollback();

}

В версии EF Core 5 были введены точки сохранения для транзакций EF Core. Когда вызывается метод SaveChanges()/SaveChangesAsync(), а транзакция уже выполняется, исполняющая среда EF Core создает в этой транзакции точку сохранения. Если вызов терпит неудачу, то откат транзакции происходит в точку сохранения, а не в начало транзакции. Точками сохранения можно также управлять в коде, вызывая методы CreateSavePoint() и RollbackToSavepoint() для транзакции:

using var trans = context.Database.BeginTransaction();

try

{

  // Создать, изменить, удалить запись.

  trans.CreateSavepoint("check point 1");

  context.SaveChanges();

  trans.Commit();

}

catch (Exception ex)

{

  trans. RollbackToSavepoint("check point 1");

}

Транзакции и стратегии выполнения

 В случае активной стратегии выполнения (как при использовании EnableRetryOnFailure()) перед созданием явной транзакции вы должны получить ссылку на текущую стратегию выполнения, которая применяется EF Core. Затем вызовите на этой стратегии метод Execute(), чтобы создать явную транзакцию:

var strategy = context.Database.CreateExecutionStrategy();

strategy.Execute(() =>

{

Перейти на страницу:
Комментариев (0)