1. ホーム
  2. asp.net-mvc

[解決済み] 新しい ASP.NET MVC 6 の ID の AspNetUsers テーブルの ConcurrencyStamp カラムの目的は何ですか?

2023-07-05 03:55:45

質問

の目的は何ですか? ConcurrencyStamp のカラムは何のためにあるのですか? AspNetUsers テーブルのカラムを、新しい ASP.NET MVC 6 の ID で使用できますか?

これは、データベーススキーマの AspNetUsers テーブルのデータベーススキーマです。

また AspNetRoles テーブルにもあります。

確かASP.NET MVC 5のIDでは無かったと思います。

今のところ気づいたのは、以下のコードで定義されているので、GUID値を持っているようです。

/// <summary>
/// A random value that must change whenever a user is persisted to the store
/// </summary>
public virtual string ConcurrencyStamp { get; set; } = Guid.NewGuid().ToString();

しかし、このドキュメントでは、どのような状況で使用されるのかを理解するのに十分ではありません。

どのように解決するのですか?

名前の通り、並行更新の衝突を防ぐために使用します。

例えば UserA という名前の Peter がデータベースにあります。 2 人の管理者が UserA の編集者ページを開き、このユーザーを更新したいと思います。

  1. Admin_1 ページを開くと、Peter というユーザーが表示されました。
  2. Admin_2 はページを開き、ピーターと呼ばれるユーザーを見ました (明らかに)。
  3. Admin_1 はユーザー名をTomに更新し、データを保存します。現在 UserA という名前のDBに、Tomという名前で
  4. Admin_2 はユーザー名をThomasに更新し、保存を試みます。

ConcurrencyStampがない場合、Admin_1の更新はAdmin_2の更新に上書きされます。 しかし、私たちは ConcurrencyStamp があるため Admin_1 / Admin_2 がページを読み込むと、スタンプが読み込まれます。データを更新すると、このスタンプも変更されます。 つまり、ステップ 5 では、システムから例外がスローされ、Admin_2 に、このユーザーはすでに更新されている、なぜなら彼は ConcurrencyStamp が読み込まれたものとは異なるため、このユーザーはすでに更新されています。