簡體   English   中英

實體框架如何在不使用timestmp或rowversion的情況下檢測並發沖突

[英]How will entity framework detect concurrency conflicts , without using timestmp or rowversion

我正在使用實體框架的asp.net mvc Web應用程序上工作。 我的asp.net mvc Web應用程序中有以下模型類:

public partial class TMSSwitchPort
{
    public int TechnologyID { get; set; }
    public int SwitchID { get; set; }
    public string PortNumber { get; set; }

    public virtual Technology Technology { get; set; }
    public virtual TMSSwitch TMSSwitch { get; set; }
}

我有以下存儲庫方法:

public void changeDeviceSwitch(int fromID , int toID)
{

    var currentdevices = tms.TMSSwitchPorts.Where(a => a.SwitchID == fromID);
    foreach (var d in currentdevices)
    {
        tms.TMSSwitchPorts.Remove(d);            
    }
    foreach (var d in currentdevices)
    {
        TMSSwitchPort tsp = new TMSSwitchPort() { SwitchID = toID,
            TechnologyID = d.TechnologyID, PortNumber = d.PortNumber };
        tms.TMSSwitchPorts.Add(d);
    }
    tms.SaveChanges();
}

上面的方法將主要檢索具有特定switchID的所有對象,刪除它們,並使用新的switchID添加新記錄。 當前,我正在嘗試了解並發用戶同時執行該方法時會發生什么。 從我的測試中,我發現第一個用戶將能夠刪除和添加新記錄,而其他用戶將獲得DbUpdateConcurrencyException。 因此,根據我的理解,我觀察到以下情況,假設UserA和UserB同時訪問相同的方法:

  • UserA檢索所有當前設備。

  • UserB同時檢索所有當前設備。

  • UserA將所有對象標記為刪除,創建新對象Save()。

  • UserB將所有對象標記為刪除,創建新對象,

  • 現在,當userB到達Save()時,EF將發現有些對象(或所有對象)已被標記為刪除,但不再存在(因為它們已被UserA刪除),這將引發DbUpdateConcurrencyException。

因此,這意味着EF在嘗試刪除不再存在的對象時將引發DbUpdateConcurrencyException,即使我沒有使用時間戳也是如此。 我檢查sql探查器,並為刪除操作生成了sql語句,如下所示:

exec sp_executesql N'delete [dbo].[TMSSwitchPorts]
where (([SwitchID] = @0) and ([PortNumber] = @1))',N'@0 int,@1 nvarchar(10)',@0=467,@1=N'a'

那么我對EF對上述代碼的反應方式的理解是正確的嗎?

如果您閱讀有關DbUpdateConcurrencyException的MSDN文章, DbUpdateConcurrencyException可以看到以下說明來對其進行解釋:

當預期實體的SaveChanges將導致數據庫更新,但實際上數據庫中沒有行受到影響時,DbContext引發異常。 這通常表明數據庫已被並發更新,因此預期匹配的並發令牌實際上並未匹配。 請注意,由於安全原因,此異常引用的狀態條目不會被序列化,序列化后對狀態條目的訪問將返回null。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM