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

作成者: Scott Addie

この記事では、既存の ASP.NET Core 3.1 プロジェクトを ASP.NET Core 5.0 に更新する方法について説明します。

必須コンポーネント

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

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

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

ターゲットフレームワークを更新する

プロジェクトを更新 Blazor WebAssembly する場合は、「 Blazor WebAssembly プロジェクトの更新 」セクションに進みます。 その他の ASP.NET Core プロジェクトの種類については、プロジェクトファイルの ターゲットフレームワークモニカー (TFM) を次のように更新し net5.0 ます。

<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 パッケージキャッシュを消去します。

Blazor5.0.1 でのアプリルーティングロジックの変更と、6.0 までのさらに5.x リリース

ルートの優先順位の計算は 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 によってサポートされる機能のサブセットに対してルーティングシステムが ASP.NET Core ルーティングシステムと同じように動作することが目的であるため、実装のバグと見なされ Blazor ます。

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

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

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

重要

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

の設定または設定解除を行う機能 PreferExactMatches @false は、 旧バージョンとの互換性のためだけに用意 されています。

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

更新 Blazor WebAssembly と Blazor Server プロジェクト

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

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

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

    スタンドアロン Blazor WebAssembly または Blazor Server 例:

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

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

    +<link href="BlazorSample.Client.styles.css" rel="stylesheet" />
    
  2. コンポーネント仮想化用の アプリの ファイルに新しい _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 Server (_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. コンポーネント ( ) で、コンポーネントの HTML マークアップを、 に設定された属性を持 MainLayout Shared/MainLayout.razor <div>class 要素で囲みます page

    <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.css のファイルの Blazor WebAssembly 最新の基本 wwwroot/css/site.css ファイルには、 Blazor Server 次のスタイルが含まれています。 次のスタイルとアプリに追加したスタイルを残して、追加のスタイルを削除します。

    次のスタイルシートには基本スタイルだけが含まれています。また、開発者が追加したカスタム スタイルは含めではありません。

    @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;
    }
    

Blazor WebAssembly プロジェクトの更新

前の「更新とプロジェクト」セクション の Blazor WebAssembly ガイダンスに Blazor Server 従 います。

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

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

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

    注意

    この更新プログラムは、スタンドアロン プロジェクトと Blazor WebAssembly ホストされているソリューション Client のプロジェクトにのみ適用 Blazor されます。

  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 <div> がに設定された要素に変更し id app ます。

    -<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. Program.Mainホストさ Program.cs れている Client ソリューションのアプリの () () Blazor :

    • 必要に応じ 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} プレースホルダーはアプリの名前空間です。

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

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

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

  • アプリには、 openid スコープとスコープが必要です offline_access

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

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

詳細については、「Microsoft アカウントを使用して、ASP.NET Core Blazor WebAssembly スタンドアロン アプリをセキュリティで保護する」を参照してください。

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

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

Blazor WebAssemblyAzure 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 トークン****の暗黙的な許可無効にします

詳細については、「Azure Active Directory を使用して、ASP.NET Core Blazor WebAssembly スタンドアロン アプリをセキュリティで保護する」を参照してください。

スタンドアロン Blazor WebAssembly アプリと Azure Active Directory (AAD) B2C

前の「プロジェクトとプロジェクトの 更新 Blazor WebAssembly 」 Blazor Server セクションの ガイダンス に Blazor WebAssembly 従います。

AAD Blazor WebAssembly (AAD) B2C を使用Azure portalに登録Azure Active Directoryスタンドアロン アプリの場合:

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

    options.ProviderOptions.DefaultAccessTokenScopes.Add("openid");
    options.ProviderOptions.DefaultAccessTokenScopes.Add("offline_access");
    
  • [アプリのAzure portal認証] ブレードで、次の情報を 確認します。

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

詳細については、「Azure Active Directory B2C を使用して、ASP.NET Core Blazor WebAssembly スタンドアロン アプリをセキュリティで保護する」を参照してください。

ホスト Blazor WebAssembly されているアプリと Azure Active Directory (AAD) または AAD B2C

前の「プロジェクトとプロジェクトの 更新 Blazor WebAssembly 」 Blazor Server セクションの ガイダンス に Blazor WebAssembly 従います。

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

[アプリのAzure portal Client 認証] ブレードで、次の方法を 実行します。

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

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

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

前のセクションのガイダンスに従ってください。

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

さらに、 Server Azure Active Directory (AAD) または B2C を使用してクライアントアプリに対してユーザーを認証するプロジェクトでは、 Blazor WebAssembly 新しい 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 は、 Server Blazor WebAssembly 次のように Microsoft.NET.Sdk.Web なります。

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

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

ソリューションのクリーンとリビルド

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

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

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

トラブルシューティング

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

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

ホストされている Blazor WebAssembly アプリ:

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

認証に AAD を使用するアプリをアップグレードした後、ユーザーが AAD でサインインした後、アプリへのログイン コールバックで次のエラー Blazor WebAssembly が発生する可能性があります。

情報: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 に設定します。

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

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

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

プロジェクトの ( ) または ( ) に、以前の 5.0 プレビュー リリースの のスタイルシート要素が含まれている場合は、 wwwroot/index.html Blazor WebAssembly Pages/_Host.cshtml Blazor Server <link> scoped.styles.css タグを削除 <link> します。

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

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

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

コンポーネントを対象とする 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>

パッケージ参照の更新

プロジェクト ファイルで、パッケージ参照の 属性の 各 Microsoft.AspNetCore.* 、Microsoft.EntityFrameworkCore.* 、Microsoft.Extensions.* およびSystem.Net.Http.JsVersion 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 ステートメントと FROM スクリプトを更新します。 Core 5.0 ランタイムの ASP.NET 基本イメージを使用します。 docker pullCore 3.1 と 5.0 の ASP.NET の違いを考慮してください。

- 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 」を参照してください

MVC とページ ASP.NET Core のモデルバインドの変更 Razor

DateTime 値は、UTC 時刻としてモデルにバインドされます

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

ASP.NET Core 5.0 以降では、モデルバインドは常に DateTime UTC タイムゾーンを使用して値をバインドします。

以前の動作を保持するには、のを削除し DateTimeModelBinderProvider Startup.ConfigureServices ます。

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

ComplexObjectModelBinderProvider \ ComplexObjectModelBinder replace ComplexTypeModelBinderProvider \ ComplexTypeModelBinder

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

  • 不使用として注釈が付けられます。
  • 既定では登録されなくなりました。

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

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

UseDatabaseErrorPage obsolete

個々のユーザーアカウントのオプションを含む 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 も一覧に含まれています。