21

新的ASP.NET MVC 6身份的AspNetUsers表中的ConcurrencyStamp列的用途是什麼?新的ASP.NET MVC 6身份的AspNetUsers表中的ConcurrencyStamp列的用途是什麼?

這是AspNetUsers表的數據庫模式:

enter image description here

它也有在AspNetRoles表:

enter image description here

我記得它是不存在ASP.NET MVC 5身份。

我已經注意到到目前爲止,它似乎有,因爲它是用下面的代碼定義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(); 

但是文件是不夠的,我瞭解這情況下,它是用過的。

+2

我會_assume_(尚未使用v6),正如名稱暗示它用於處理對'用戶'的併發'更新'。我_手動添加類似的東西(例如'rowversion' /'timestamp')以[完成相同的操作](http://www.asp.net/mvc/overview/getting-started/getting-started-with-ef-using-mvc /處理併發與 - 的實體框架功能於一個-ASP淨MVC-應用程序)。 Hth ... – EdSF

+0

我開始意識到這是爲了ASP.NET緩存的目的。 –

+0

我想知道的是,爲什麼他們將它設置爲'nvarchar(MAX)',如果它不會超過我已經發現的GUID –

回答

6

From the source code itself

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

基本上,看到它,因爲它被命名爲。用於標識數據當前版本的標記。如果你改變它,郵票也是如此。

因此,如果兩個併發更新同時進入,它們必須具有相同的印記或其中一個應該丟棄。因此名稱ConcurrencyStamp

+0

。看到我的問題。 –

+0

增加了更多信息。抱歉。缺乏咖啡因。 –

2

要跟進馬克西姆的答覆:

如果你看一下IdentityDbContext在OnModelCreating()方法的實現,你會發現:

builder.Entity<TUser>(b => 
{ 
.... 
    b.Property(u => u.ConcurrencyStamp).IsConcurrencyToken(); 
.... 

,並在UserStore.UpdateAsync(。 ..) - 方法:

Context.Update(user); 
    try 
    { 
     await SaveChanges(cancellationToken); 
    } 
    catch (DbUpdateConcurrencyException) 
    { 
     return IdentityResult.Failed(ErrorDescriber.ConcurrencyFailure()); 
    } 

所以,這的確做什麼它應該做的:用戶對象上防止併發更新。令牌僅用於ASP Identity EntityFramework模塊中的「引擎蓋下」。基本上,如果發生一個用戶對象的併發更新,數據庫上下文將拋出DbUpdateConcurrencyException。

20

作爲名稱狀態,它用於防止併發更新衝突。

例如,在數據庫中有一個名爲Peter的UserA 2管理員打開UserA的編輯器頁面,想要更新此用戶。

  1. Admin_1打開頁面,並看到用戶名爲Peter。
  2. Admin_2打開了頁面,看到用戶叫Peter(顯然)。
  3. Admin_1將用戶名更新爲Tom,並保存數據。現在UserA在名爲Tom的數據庫中。
  4. Admin_2更新了用戶名到Thomas,並嘗試保存它。

如果沒有ConcurrencyStamp會發生什麼情況Admin_1的更新將被Admin_2的更新覆蓋。 但是由於我們有ConcurrencyStamp,因此當Admin_1/Admin_2加載頁面時,會加載圖章。更新數據時,這個圖章也將被更改。 因此,現在步驟5將是系統拋出異常,通知Admin_2該用戶已更新,因爲他的ConcurrencyStamp與他加載的不同。

相關問題