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

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

Книгу Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен читаем онлайн бесплатно полную версию! Чтобы начать читать не надо регистрации. Напомним, что читать онлайн вы можете не только на компьютере, но и на андроид (Android), iPhone и iPad. Приятного чтения!

178 0 18:04, 26-08-2023
Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен
26 август 2023

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

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

    1 ... 303 304 305 306 307 308 309 310 311 ... 407
    Перейти на страницу:
    подробно обсуждалась в предыдущей главе. Вспомните, что когда внутри сущности определено свойство TimeStamp, то значение этого свойства используется в конструкции WHERE при сохранении изменений (обновлений или удалений) в базе данных. Вместо поиска только первичного ключа к запросу добавляется поиск значения TimeStamp, например:

    UPDATE [dbo].[Inventory] SET [PetName] = @p0

    WHERE [Id] = @p1 AND [TimeStamp] = @p2;

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

    [Fact]

    public void ShouldThrowConcurrencyException()

    {

      ExecuteInATransaction(RunTheTest);

      void RunTheTest()

      {

        var car = Context.Cars.First();

        // Обновить базу данных за пределами контекста.

        Context.Database.ExecuteSqlInterpolated(

          $"Update dbo.Inventory set Color='Pink' where Id = {car.Id}");

        car.Color = "Yellow";

        var ex = Assert.Throws<CustomConcurrencyException>(

          () => Context.SaveChanges());

        var entry = ((DbUpdateConcurrencyException) ex.InnerException)?.Entries[0];

        PropertyValues originalProps = entry.OriginalValues;

        PropertyValues currentProps = entry.CurrentValues;

        // Требует еще одного обращения к базе данных.

        PropertyValues databaseProps = entry.GetDatabaseValues();

      }

    }

    Ниже показаны выполняемые операторы SQL. Первым из них является оператор UPDATE, а вторым — обращение для получения значений базы данных:

    exec sp_executesql N'SET NOCOUNT ON;

    UPDATE [dbo].[Inventory] SET [Color] = @p0

    WHERE [Id] = @p1 AND [TimeStamp] = @p2;

    SELECT [TimeStamp]

    FROM [dbo].[Inventory]

    WHERE @@ROWCOUNT = 1 AND [Id] = @p1;'

    ,N'@p1 int,@p0 nvarchar(50),@p2 varbinary(8)',@p1=1,@p0=N'Yellow',

    @p2=0x0000000000008665

    exec sp_executesql N'SELECT TOP(1) [i].[Id], [i].[Color],

         [i].[IsDrivable], [i].[MakeId], [i].[PetName], [i].[TimeStamp]

    FROM [dbo].[Inventory] AS [i]

    WHERE [i].[Id] = @__p_0',N'@__p_0 int',@__p_0=1

    Удаление записей

    Одиночная сущность помечается для удаления путем вызова Remove() на DbSet<T> или установки ее состояния в Deleted. Список записей помечается для удаления вызовом RemoveRange() на DbSet<T>. Процесс удаления будет вызывать эффекты каскадирования для навигационных свойств на основе правил, сконфигурированных в методе OnModelCreating() (и регламентированных соглашениями EF Core). Если удаление не допускается из -за политики каскадирования, тогда генерируется исключение.

    Состояние сущности

    Когда метод Remove() вызывается на отслеживаемой сущности, свойство EntityState устанавливается в Deleted. После успешного выполнения оператора удаления сущность исключается из ChangeTracker и состояние изменяется на Detached. Обратите внимание, что сущность по-прежнему существует в вашем приложении, если только она не покинула область видимости и не была подвержена сборке мусора.

    Удаление отслеживаемых сущностей

    Процесс удаления зеркально отображает процесс обновления. Как только сущность начала отслеживаться, вызовите Remove() на контексте и затем вызовите SaveChanges(), чтобы удалить запись из базы данных:

    [Fact]

    public void ShouldRemoveACar()

    {

      ExecuteInATransaction(RunTheTest);

      void RunTheTest()

      {

        var carCount = Context.Cars. Count();

        var car = Context.Cars.First(c => c.Id == 2);

        Context.Cars.Remove(car);

        Context.SaveChanges();

        var newCarCount = Context.Cars.Count();

        Assert.Equal(carCount - 1, newCarCount);

        Assert.Equal(

          EntityState.Detached,

          Context.Entry(car).State);

      }

    }

    После вызова SaveChanges() экземпляр сущности все еще существует, но больше не находится в ChangeTracker. Состоянием EntityState будет Detached. Вот как выглядит выполняемый код SQL:

    exec sp_executesql N'SET NOCOUNT ON;

    DELETE FROM [dbo].[Inventory]

    WHERE [Id] = @p0 AND [TimeStamp] = @p1;

    SELECT @@ROWCOUNT;'

    ,N'@p0 int,@p1 varbinary(8)',@p0=2,

    @p1=0x0000000000008680

    Удаление неотслеживаемых сущностей

    Неотслеживаемые сущности способны удалять записи таким же способом, каким они могут обновлять записи. Удаление производится вызовом Remove()/RemoveRange() или установкой состояния в Deleted и последующим вызовом SaveChanges().

    В показанном ниже тесте сначала читается запись как неотслеживаемая и на основе записи создается новый экземпляр класса Car. Затем либо устанавливается состояние в Deleted, либо применяется метод Remove() класса DbSet<T> (в зависимости от того, какая строка кода закомментирована) и вызывается SaveChanges(). Все дополнительные контексты нужны для обеспечения точности теста и отсутствия пересечения между контекстами:

    [Fact]

    public void ShouldRemoveACarUsingState()

    {

      ExecuteInASharedTransaction(RunTheTest);

      void RunTheTest(IDbContextTransaction trans)

      {

        var carCount = Context.Cars.Count();

        var car = Context.Cars.AsNoTracking().First(c => c.Id == 2);

        var context2 = TestHelpers.GetSecondContext(Context, trans);

        // Либо модифицировать состояние, либо вызвать Remove().

        context2.Entry(car).State = EntityState.Deleted;

        // context2.Cars.Remove(car);

        context2.SaveChanges();

        var newCarCount = Context.Cars.Count();

        Assert.Equal(carCount - 1, newCarCount);

        Assert.Equal(

          EntityState.Detached,

          Context.Entry(car).State);

      }

    }

    Перехват отказов каскадного удаления

    Когда попытка удаления записи терпит неудачу из-за правил каскадирования, то исполняющая среда EFCore генерирует исключение DbUpdateException. Следующий тест демонстрирует это в действии:

    [Fact]

    public void ShouldFailToRemoveACar()

    {

      ExecuteInATransaction(RunTheTest);

       void RunTheTest()

      {

        var car = Context.Cars.First(c => c.Id == 1);

        Context.Cars.Remove(car);

        Assert.Throws<CustomDbUpdateException>(

          ()=>Context.SaveChanges());

      }

    }

    Проверка параллелизма

    Если сущность имеет свойство TimeStamp, то при удалении также используется проверка параллелизма. Дополнительную информацию ищите в подразделе "Проверка параллелизма" внутри раздела "Обновление записей" ранее в главе.

    Резюме

    В настоящей главе было закончено построение уровня доступа к данным AutoLot на основе сведений, полученных в предыдущей главе. С помощью инструментов командной строки EF Core вы создали шаблоны сущностей для существующей базы данных, обновили модель до финальной версии, а также создали и применили миграции. Для инкапсуляции доступа к данным вы добавили хранилища. Написанный код инициализации базы данных способен удалять и заново создавать базу данных повторяемым и надежным способом. В заключение готовый уровень доступа к данным главе был протестирован. На этом тема доступа к данным и Entity Framework Core завершена.

    Часть VIII

    Разработка клиентских приложений для Windows

    1 ... 303 304 305 306 307 308 309 310 311 ... 407
    Перейти на страницу:
    1. Жалоба
    Отзывы - 0

    Прочитали книгу? Предлагаем вам поделится своим отзывом от прочитанного(прослушанного)! Ваш отзыв будет полезен читателям, которые еще только собираются познакомиться с произведением.


    Уважаемые читатели, слушатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

    • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
    • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
    • 3. Просьба отказаться от нецензурной лексики.
    • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

    Надеемся на Ваше понимание и благоразумие. С уважением, администратор LoveRead.info.


    Установить VPN и читай слушай бесплатно

    Новые отзывы

    1. Людмила Хофман Людмила Хофман10 июнь 22:13 У меня перевернулся мир после прочтения ваших книг! Так приятно и чисто на душе, ведь по сути неважно кто с кем , а только любовь... Долгая игра - Рейчел Рид
    2. Анна Анна08 июнь 11:28 Спасибо за новую историю жизни и любви на сайте,прочитала с удовольствием .... Давай поженимся - Юлия Резник
    3. Елена Елена08 июнь 11:13 Прочла несколько романов этого, без сомнения, талантливого автора. Впечатление прекрасное, но хотелось бы когда-нибудь прочесть... Предатель. Ты врал мне годами - Арина Арская
    Все комметарии
    Новинки бесплатной онлайн библиотеки