ASP.NET Core 3.1 から 5.0 への移行

この記事では、既存の ASP.NET Core 3.1 プロジェクトを ASP.NET Core 5.0 に更新する方法について説明します。 ASP.NET Core 3.1 から ASP.NET Core 6.0 に移行する方法については、「 ASP.NET Core 3.1 から6.0 への移行」を参照してください。

必須コンポーネント

global.json での .NET Core SDK バージョンの更新

特定の .NET Core SDK バージョンをターゲットとする グローバルな json ファイルに依存する場合は、 インストールされている .net 5.0 SDK バージョンにプロパティを更新します。 次に例を示します。

{
  "sdk": {
-    "version": "3.1.200"
+    "version": "5.0.100"
  }
}

ターゲット フレームワークの更新

Webassembly を更新する場合は、 Blazor 「」に進んで Update Blazor WebAssembly projects ください。 その他の ASP.NET Core プロジェクトの種類については、プロジェクトファイルのターゲットフレームワークモニカー (tfm)を次のように更新し ます。

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
-    <TargetFramework>netcoreapp3.1</TargetFramework>
+    <TargetFramework>net5.0</TargetFramework>
  </PropertyGroup>

</Project>

bin フォルダーと obj フォルダーを削除する

bin および obj フォルダーの削除が必要になる場合があります。 dotnet nuget locals --clear all を実行して、NuGet パッケージ キャッシュを消去します。

5\.0.1 およびさらに 5.x リリースから 6.0 まででの、Blazor アプリ ルーティング ロジックの変更

ルートの優先順位の評価が、ASP.NET Core 5.0.1 パッチ リリースで変更されました。 これは、キャッチオール ルートまたはオプション パラメーターのあるルートを定義した場合に、影響を与える可能性があります。

以前の動作

ASP.NET Core 5.0.0 以前の動作では、{*slug} などの優先順位の低いルートが、/customer/{id} などの優先順位の高いルートより前に照合されます。

新しい動作

ASP.NET Core 5.0.1 以降の新しい動作では、ASP.NET Core アプリで定義されているルーティング動作とより厳密に一致するようになり、最初にフレームワークによって各セグメントのルートの優先順位が計算されて確立され、ルートの長さのみが同じ優先順位のときの 2 次基準として使用されます。

変更理由

Blazor のルーティングによってサポートされる機能のサブセットに対して、Blazor のルーティング システムを ASP.NET Core のルーティング システムと同じように動作させることが目的なので、元の動作は実装でのバグと見なされます。

App.razor ファイルの Router コンポーネントに PreferExactMatches 属性を追加して、正しい動作を選択します。

<Router AppAssembly="@typeof(Program).Assembly" PreferExactMatches="@true">

PreferExactMatches@true に設定されている場合、ルートの照合時にワイルドカードよりも完全一致が優先されます。

重要

すべてのアプリで、明示的に PreferExactMatches@true に設定する必要があります。

の設定または設定解除を行う機能 PreferExactMatches@false は、 PreferExactMatchesされています。

.NET 6 がリリースされると、ルーターは常に完全一致を優先するようになり、PreferExactMatches オプションは使用できなくなります。

BlazorWebassembly サーバープロジェクトを更新する Blazor

このセクションのガイダンスは、両方の Blazor ホストモデルに適用されます。 このセクションの後のセクションでは、ホスティングモデルとアプリの種類に固有の追加のガイダンスを提供します。 関連するすべてのセクションのガイダンスをアプリに適用します。

  1. wwwroot/index.htmlBlazor Webassembly またはサーバーアプリので、 Pages/_Host.cshtmlBlazor<link> スタイルの要素に要素を追加し <head> ます。 次の <link> 要素の href 属性の値で、プレースホルダー {ASSEMBLY NAME} はアプリのアセンブリ名です。

    +<link href="{ASSEMBLY NAME}.styles.css" rel="stylesheet" />
    

    スタンドアロン Blazor またはサーバーの Blazor 例:

    +<link href="BlazorSample.styles.css" rel="stylesheet" />
    

    Client ホストされているソリューションの例のプロジェクト Blazor :

    +<link href="BlazorSample.Client.styles.css" rel="stylesheet" />
    
  2. _Imports.razor_Imports.razor用に、アプリのファイルに新しい名前空間を含め Microsoft.AspNetCore.Components.Web.Virtualization ます。 次の _Imports.razor ファイルでは、Blazor プロジェクト テンプレートから生成されるアプリでの既定の名前空間が示されています。 プレースホルダー {ASSEMBLY NAME} は、アプリのアセンブリ名です。

    Blazor WebAssembly _Imports.razor ):

    @using System.Net.Http
    @using System.Net.Http.Json
    @using Microsoft.AspNetCore.Components.Forms
    @using Microsoft.AspNetCore.Components.Routing
    @using Microsoft.AspNetCore.Components.Web
    @using Microsoft.AspNetCore.Components.Web.Virtualization
    @using Microsoft.AspNetCore.Components.WebAssembly.Http
    @using Microsoft.JSInterop
    @using {ASSEMBLY NAME}
    @using {ASSEMBLY NAME}.Shared
    

    Blazor サーバー ( _Imports.razor ):

    @using System.Net.Http
    @using Microsoft.AspNetCore.Authorization
    @using Microsoft.AspNetCore.Components.Authorization
    @using Microsoft.AspNetCore.Components.Forms
    @using Microsoft.AspNetCore.Components.Routing
    @using Microsoft.AspNetCore.Components.Web
    @using Microsoft.AspNetCore.Components.Web.Virtualization
    @using Microsoft.JSInterop
    @using {ASSEMBLY NAME}
    @using {ASSEMBLY NAME}.Shared
    
  3. MainLayout コンポーネント (Shared/MainLayout.razor) では、class 属性が page に設定された <div> 要素で、コンポーネントの HTML マークアップを囲みます。

    <div class="page">
    
        ...
    
    </div>
    
  4. 次のファイルを Shared フォルダーに追加します。

    MainLayout.razor.css:

    .page {
        position: relative;
        display: flex;
        flex-direction: column;
    }
    
    .main {
        flex: 1;
    }
    
    .sidebar {
        background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%);
    }
    
    .top-row {
        background-color: #f7f7f7;
        border-bottom: 1px solid #d6d5d5;
        justify-content: flex-end;
        height: 3.5rem;
        display: flex;
        align-items: center;
    }
    
        .top-row ::deep a, .top-row .btn-link {
            white-space: nowrap;
            margin-left: 1.5rem;
        }
    
        .top-row a:first-child {
            overflow: hidden;
            text-overflow: ellipsis;
        }
    
    @media (max-width: 767.98px) {
        .top-row:not(.auth) {
            display: none;
        }
    
        .top-row.auth {
            justify-content: space-between;
        }
    
        .top-row a, .top-row .btn-link {
            margin-left: 0;
        }
    }
    
    @media (min-width: 768px) {
        .page {
            flex-direction: row;
        }
    
        .sidebar {
            width: 250px;
            height: 100vh;
            position: sticky;
            top: 0;
        }
    
        .top-row {
            position: sticky;
            top: 0;
            z-index: 1;
        }
    
        .main > div {
            padding-left: 2rem !important;
            padding-right: 1.5rem !important;
        }
    }
    

    NavMenu.razor.css:

    .navbar-toggler {
        background-color: rgba(255, 255, 255, 0.1);
    }
    
    .top-row {
        height: 3.5rem;
        background-color: rgba(0,0,0,0.4);
    }
    
    .navbar-brand {
        font-size: 1.1rem;
    }
    
    .oi {
        width: 2rem;
        font-size: 1.1rem;
        vertical-align: text-top;
        top: -2px;
    }
    
    .nav-item {
        font-size: 0.9rem;
        padding-bottom: 0.5rem;
    }
    
        .nav-item:first-of-type {
            padding-top: 1rem;
        }
    
        .nav-item:last-of-type {
            padding-bottom: 1rem;
        }
    
        .nav-item ::deep a {
            color: #d7d7d7;
            border-radius: 4px;
            height: 3rem;
            display: flex;
            align-items: center;
            line-height: 3rem;
        }
    
    .nav-item ::deep a.active {
        background-color: rgba(255,255,255,0.25);
        color: white;
    }
    
    .nav-item ::deep a:hover {
        background-color: rgba(255,255,255,0.1);
        color: white;
    }
    
    @media (min-width: 768px) {
        .navbar-toggler {
            display: none;
        }
    
        .collapse {
            /* Never collapse the sidebar for wide screens */
            display: block;
        }
    }
    
  5. wwwroot/css/app.cssBlazor Webassembly またはサーバーアプリのファイルの最新の基本ファイルには wwwroot/css/site.cssBlazor 、次のスタイルが含まれています。 次のスタイルと、自分でアプリに追加したものを残して、余分なスタイルを削除します。

    次のスタイルシートには、基本スタイルのみが含まれており、開発者によって追加されたカスタム スタイルは含まれていません

    @import url('open-iconic/font/css/open-iconic-bootstrap.min.css');
    
    html, body {
        font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
    }
    
    a, .btn-link {
        color: #0366d6;
    }
    
    .btn-primary {
        color: #fff;
        background-color: #1b6ec2;
        border-color: #1861ac;
    }
    
    .content {
        padding-top: 1.1rem;
    }
    
    .valid.modified:not([type=checkbox]) {
        outline: 1px solid #26b050;
    }
    
    .invalid {
        outline: 1px solid red;
    }
    
    .validation-message {
        color: red;
    }
    
    #blazor-error-ui {
        background: lightyellow;
        bottom: 0;
        box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2);
        display: none;
        left: 0;
        padding: 0.6rem 1.25rem 0.7rem 1.25rem;
        position: fixed;
        width: 100%;
        z-index: 1000;
    }
    
    #blazor-error-ui .dismiss {
        cursor: pointer;
        position: absolute;
        right: 0.75rem;
        top: 0.5rem;
    }
    

BlazorWebassembly プロジェクトを更新する

前のセクションのガイダンスに従って Update Blazor WebAssembly and Blazor Server projects ください。

ホストされた Blazor ソリューションのプロジェクトを含む webassembly の場合は、 ClientBlazor 次の変更をプロジェクトファイルに適用します。

  1. SDK を Microsoft.NET.Sdk.Web から Microsoft.NET.Sdk.BlazorWebAssembly に更新します。

    - <Project Sdk="Microsoft.NET.Sdk.Web">
    + <Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly">
    

    注意

    この更新プログラムは、スタンドアロン Blazor のプロジェクトおよびホストされたソリューションのプロジェクトにのみ適用さ ClientBlazor れます。

  2. 次のプロパティを更新します。

    <Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly">
    
      <PropertyGroup>
    -     <TargetFramework>netstandard2.1</TargetFramework>
    -     <RazorLangVersion>3.0</RazorLangVersion>
    +     <TargetFramework>net5.0</TargetFramework>
      </PropertyGroup>
    
  3. Microsoft.AspNetCore.Components.WebAssembly.Build へのパッケージ参照を削除します。

    <ItemGroup>
    -    <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Build" Version="3.2.1" PrivateAssets="all" />
    
  4. 他のパッケージを最新バージョンに更新します。 最新バージョンは、NuGet.org で確認できます。

  5. wwwroot/index.html で、App コンポーネントを読み込む要素を、idapp に設定された <div> 要素に変更します。

    -<app>Loading...</app>
    +<div id="app">Loading...</div>
    
  6. Program.Main (Program.cs) で、<app> 要素への参照を、ハッシュ # を追加することで CSS セレクターに変更します。

    -builder.RootComponents.Add<App>("app");
    +builder.RootComponents.Add<App>("#app");
    
  7. Program.Main (Program.cs) で、既定の一時的な HttpClient 登録を、スコープ付きに変更します (存在する場合)。

    -builder.Services.AddTransient(sp => new HttpClient 
    -    { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });
    +builder.Services.AddScoped(sp => new HttpClient 
    +    { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });
    
  8. ホストされた Blazor ソリューションの Client アプリの Program.Main (Program.cs) で:

    • 必要に応じて、builder.HostEnvironment.BaseAddress を文字列のクライアント ベース アドレスに置き換えます。
    • 名前付きの一時クライアント ファクトリの登録を、スコープ付きに変更します。
    -builder.Services.AddHttpClient("{APP NAMESPACE}.ServerAPI", 
    -    client => client.BaseAddress = new Uri("https://localhost:5001"))
    -    .AddHttpMessageHandler<BaseAddressAuthorizationMessageHandler>();
    -builder.Services.AddTransient(sp => sp.GetRequiredService<IHttpClientFactory>()
    -    .CreateClient("{APP NAMESPACE}.ServerAPI"));
    +builder.Services.AddHttpClient("{APP NAMESPACE}.ServerAPI", 
    +    client => client.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress))
    +    .AddHttpMessageHandler<BaseAddressAuthorizationMessageHandler>();
    +builder.Services.AddScoped(sp => sp.GetRequiredService<IHttpClientFactory>()
    +    .CreateClient("{APP NAMESPACE}.ServerAPI"));
    

    前のコードで、{APP NAMESPACE} プレースホルダーはアプリの名前空間です。

BlazorMicrosoft アカウントを使用したスタンドアロンアプリ

前のセクションとセクションのガイダンスに従って Update Blazor WebAssembly and Blazor Server projectsUpdate Blazor WebAssembly projects ください。

BlazorAzure portal に登録されているスタンドアロンアプリの場合は、Microsoft アカウントに Azure Active Directory (AAD) を使用します。

  • アプリには、openid および offline_access スコープが必要です。

    options.ProviderOptions.DefaultAccessTokenScopes.Add("openid");
    options.ProviderOptions.DefaultAccessTokenScopes.Add("offline_access");
    
  • Azure portal のアプリ登録の [認証] ブレードで:

    1. Web プラットフォームの構成を削除します。
    2. アプリのリダイレクト URI を使用して、シングルページ アプリケーション プラットフォームの構成を追加します。
    3. [アクセス トークン][ID トークン][暗黙的な許可] を無効にします。

詳細については、「Secure an ASP.NET Core Blazor WebAssembly standalone app with Microsoft Accounts」を参照してください。

BlazorAzure Active Directory を使用したスタンドアロンアプリ (AAD)

前のセクションとセクションのガイダンスに従って Update Blazor WebAssembly and Blazor Server projectsUpdate Blazor WebAssembly projects ください。

BlazorAzure Active Directory (AAD) を使用するために Azure portal に登録されているスタンドアロンアプリの場合:

  • アプリには、https://graph.microsoft.com/User.Read スコープが必要です。

    options.ProviderOptions.DefaultAccessTokenScopes
        .Add("https://graph.microsoft.com/User.Read");
    
  • Azure portal のアプリ登録の [認証] ブレードで:

    1. Web プラットフォームの構成を削除します。
    2. アプリのリダイレクト URI を使用して、シングルページ アプリケーション プラットフォームの構成を追加します。
    3. [アクセス トークン][ID トークン][暗黙的な許可] を無効にします。

詳細については、「Secure an ASP.NET Core Blazor WebAssembly standalone app with Azure Active Directory」を参照してください。

BlazorAzure Active Directory (AAD) B2C を使用したスタンドアロンアプリ

前のセクションとセクションのガイダンスに従って Update Blazor WebAssembly and Blazor Server projectsUpdate Blazor WebAssembly projects ください。

BlazorAzure Active Directory (AAD) B2C を使用するために Azure portal に登録されているスタンドアロンアプリの場合:

  • アプリには、openid および offline_access スコープが必要です。

    options.ProviderOptions.DefaultAccessTokenScopes.Add("openid");
    options.ProviderOptions.DefaultAccessTokenScopes.Add("offline_access");
    
  • Azure portal のアプリ登録の [認証] ブレードで:

    1. Web プラットフォームの構成を削除します。
    2. アプリのリダイレクト URI を使用して、シングルページ アプリケーション プラットフォームの構成を追加します。
    3. [アクセス トークン][ID トークン][暗黙的な許可] を無効にします。

詳細については、「Secure an ASP.NET Core Blazor WebAssembly standalone app with Azure Active Directory B2C」を参照してください。

BlazorAzure Active Directory (AAD) または AAD B2C を使用してホストされているアプリ

前のセクションとセクションのガイダンスに従って Update Blazor WebAssembly and Blazor Server projectsUpdate Blazor WebAssembly projects ください。

ユーザー認証に AAD または AAD B2C を使用するホストされた Blazor ソリューションの Client アプリ登録では、Clientの Azure Apps プラットフォーム構成を使用する必要があります。

Azure portal の Client アプリ登録の Client ブレードで:

  1. Web プラットフォームの構成を削除します。
  2. アプリのリダイレクト URI を使用して、シングルページ アプリケーション プラットフォームの構成を追加します。
  3. [アクセス トークン][ID トークン][暗黙的な許可] を無効にします。

詳細については、次を参照してください。

ホストされた Blazor ソリューションの Server プロジェクトを更新する

これまでのセクションのガイダンスに従います。

この記事の一般的なガイダンスに従って、ASP.NET Core アプリとしてホストされた Blazor ソリューションの Server プロジェクトを更新します。

また、 ServerBlazor Azure Active Directory (AAD) または B2C を使用してユーザーをクライアント webasアプリに認証するプロジェクトでは、新しい Microsoft v2.0 パッケージを採用する必要があり Identity ます。

AAD の場合:

-<PackageReference Include="Microsoft.AspNetCore.Authentication.AzureAD.UI" Version="..." />
+<PackageReference Include="Microsoft.Identity.Web" Version="{VERSION}" />
+<PackageReference Include="Microsoft.Identity.Web.UI" Version="{VERSION}" />

AAD B2C の場合:

-<PackageReference Include="Microsoft.AspNetCore.Authentication.AzureADB2C.UI" Version="..." />
+<PackageReference Include="Microsoft.Identity.Web" Version="{VERSION}" />
+<PackageReference Include="Microsoft.Identity.Web.UI" Version="{VERSION}" />

前記のパッケージ参照については、NuGet.org で {VERSION} プレースホルダーのパッケージ バージョンを確認します。

注意

ホストされているソリューション内のプロジェクトの SDK は、 ServerBlazor 次のように Microsoft.NET.Sdk.Web なります。

<Project Sdk="Microsoft.NET.Sdk.Web">

詳細については、次を参照してください。

ソリューションをクリーンアップしてリビルドする

アプリまたはソリューションを .NET 5 に移行した後、アプリまたはソリューションをクリーンアップしてリビルドします。 新しいパッケージ参照とキャッシュされたパッケージの間に、パッケージの非互換性が存在する場合:

  1. コマンド シェルで次の dotnet nuget locals コマンドを実行して、NuGet パッケージ キャッシュをクリアします。

    dotnet nuget locals --clear all
    
  2. アプリまたはソリューションをクリーンアップしてリビルドします。

トラブルシューティング

アプリに適用されるセキュリティに関するトピックの最後にある トラブルシューティング のガイダンスに従って ください。

スタンドアロンの Blazor WebAssembly アプリ:

ホストされた Blazor WebAssembly アプリ:

Azure Active Directory (AAD) で認可されていないクライアント

Blazor認証に AAD を使用する webassembly をアップグレードすると、ユーザーが AAD でサインインした後に、ログインコールバックでアプリに対して次のエラーが表示されることがあります。

情報:Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[2] 承認に失敗しました。 次の要件が満たされていません。DenyAnonymousAuthorizationRequirement:認証済みユーザーが必要です。

AAD からのログイン コールバック エラー:

  • エラー: unauthorized_client
  • 説明: AADB2C90058: The provided application is not configured to allow public clients.

このエラーを解決するには:

  1. Azure portal で、アプリのマニフェストにアクセスします。
  2. allowPublicClient 属性を null または true に設定します。

Blazor プログレッシブ Web アプリケーション (PWA) を更新する

PWA アプリのプロジェクト ファイルに次の項目を追加します。

<ItemGroup>
  <ServiceWorker Include="wwwroot\service-worker.js" 
    PublishedContent="wwwroot\service-worker.published.js" />
</ItemGroup>

プロジェクトの wwwroot/index.html ( Blazor webassembly または Pages/_Host.cshtml ( Blazor サーバー) に、 <link> 以前の 5.0 preview リリースからの stylesheet 要素が含まれている場合は、 scoped.styles.css タグを削除し <link> ます。

-<link href="_framework/scoped.styles.css/" rel="stylesheet" />

Razor クラス ライブラリ (RCL) を更新する

ASP.NET Core 5.0 の一部として導入された新しい API または機能を利用するため、Razor クラス ライブラリ (RCL) を移行します。

コンポーネントを対象とする RCL を更新するには:

  1. プロジェクト ファイルで次のプロパティを更新します。

    <Project Sdk="Microsoft.NET.Sdk.Razor">
    
      <PropertyGroup>
    -     <TargetFramework>netstandard2.0</TargetFramework>
    -     <RazorLangVersion>3.0</RazorLangVersion>
    +     <TargetFramework>net5.0</TargetFramework>
      </PropertyGroup>
    
  2. 他のパッケージを最新バージョンに更新します。 最新バージョンは、NuGet.org で確認できます。

MVC を対象とする RCL を更新するには、プロジェクト ファイルで次のプロパティを更新します。

<Project Sdk="Microsoft.NET.Sdk.Razor">

  <PropertyGroup>
-    <TargetFramework>netcoreapp3.1</TargetFramework>
+    <TargetFramework>net5.0</TargetFramework>
    <AddRazorSupportForMvc>true</AddRazorSupportForMvc>
  </PropertyGroup>

パッケージ参照の更新

プロジェクトファイルで、 AspNetCore.*、"Microsoft. entityframeworkcore.*"、" microsoft. Extensions." の各パッケージ参照の属性を、5.0.0 以降に更新します。 次に例を示します。

<ItemGroup>
-    <PackageReference Include="Microsoft.AspNetCore.JsonPatch" Version="3.1.6" />
-    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.6">
-    <PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="3.1.6" />
-    <PackageReference Include="System.Net.Http.Json" Version="3.2.1" />
+    <PackageReference Include="Microsoft.AspNetCore.JsonPatch" Version="5.0.0" />
+    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="5.0.0">
+    <PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="5.0.0" />
+    <PackageReference Include="System.Net.Http.Json" Version="5.0.0" />
</ItemGroup>

Docker イメージの更新

Docker を使用するアプリでは、 Dockerfile ステートメントとスクリプトを更新します。 ASP.NET Core 5.0 ランタイムを含む基本イメージを使用します。 ASP.NET Core 3.1 と 5.0 の間では、docker pull コマンドに次の違いがあることに注意してください。

- docker pull mcr.microsoft.com/dotnet/core/aspnet:3.1
+ docker pull mcr.microsoft.com/dotnet/aspnet:5.0

製品名が ".NET" に変わるのに伴い、Docker イメージは mcr.microsoft.com/dotnet/core リポジトリから mcr.microsoft.com/dotnet に移動されました。 詳しくは、dotnet/dotnet-docker#1939 をご覧ください。

ASP.NET Core MVC と Razor Pages でのモデル バインドの変更

DateTime 値は UTC 時刻としてモデル バインドされる

ASP.NET Core 3.1 以前では、DateTime 値はローカル時刻としてモデル バインドされ、タイム ゾーンはサーバーによって決定されました。 入力書式 (JSON) からバインドされた DateTime 値と DateTimeOffset 値は、UTC タイム ゾーンとしてバインドされました。

ASP.NET Core 5.0 以降のモデル バインドでは、DateTime 値は一貫して UTC タイム ゾーンとバインドされます。

以前の動作を維持するには、Startup.ConfigureServicesDateTimeModelBinderProvider を削除します。

services.AddControllersWithViews(options => 
    options.ModelBinderProviders.RemoveType<DateTimeModelBinderProvider>());

ComplexObjectModelBinderProvider\ComplexObjectModelBinder による ComplexTypeModelBinderProvider\ComplexTypeModelBinder の置き換え

モデルバインド C# 9 レコードの種類のサポートを追加するには、次のようにし ます。

  • 古い形式として注釈付けされます。
  • 既定では登録されなくなります。

ModelBinderProviders コレクションに ComplexTypeModelBinderProvider が存在することに依存するアプリでは、新しいバインダー プロバイダーを参照する必要があります。

- var complexModelBinderProvider = options.ModelBinderProviders.OfType<ComplexTypeModelBinderProvider>();
+ var complexModelBinderProvider = options.ModelBinderProviders.OfType<ComplexObjectModelBinderProvider>();

UseDatabaseErrorPage の廃止

個々のユーザー アカウントに対するオプションが含まれる ASP.NET Core 3.1 のテンプレートでは、UseDatabaseErrorPage の呼び出しが生成されます。 UseDatabaseErrorPage は古くなり、次のコードに示すように、AddDatabaseDeveloperPageExceptionFilterUseMigrationsEndPoint の組み合わせに置き換える必要があります。

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));
+   services.AddDatabaseDeveloperPageExceptionFilter();
    services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
        .AddEntityFrameworkStores<ApplicationDbContext>();
    services.AddRazorPages();
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
+       app.UseMigrationsEndPoint();
-       app.UseDatabaseErrorPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

詳細については、次を参照してください。この GitHub の問題します。

破壊的変更の確認

.NET Core 3.1 から .NET 5.0 への破壊的変更については、バージョン 3.1 から 5.0 への移行の破壊的変更に関するページをご覧ください。 一覧には、ASP.NET Core と Entity Framework Core も含まれます。