![](/img/trans.png)
[英]Getting a the new value of RowVersion using Entity Framework 6
[英]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.