我正在尋找一個優雅的解決方案來處理實體框架中的併發衝突。實體框架中記錄的併發訪問
我的用於服用藥物的表格有幾個欄目,如藥物名稱,劑量,頻率,給藥方法,註釋等等。操作員可以在查看記錄後修改劑量,頻率,管理方法等字段,也可以只添加註釋。
我們正在使用SQL Server數據庫。
我添加了timestamp
類型的列LastUpdated
。我正在使用此列來提高DbUpdateConcurrencyException
。 LastUpdated
列中的ConcurrencyMode
列已在實體設計器中設置爲Fixed
。
從我的控制器類的代碼片段:
// drugId and strNotes are passed from edit screen
DataAccessLayer.Dal dal= new DataAccessLayer.Dal();
// Select record
DrugDetail drugDetail = (from drugRow in dal.DrugDetails
where drugRow.id == drugId
select drugRow).ToList<DrugDetail>()[0];
// Assign notes
drugDetail.Notes = strNotes;
try
{
dal.SaveChanges();
}
catch(DbUpdateConcurrencyException ex)
{
((IObjectContextAdapter)dal).ObjectContext.
Refresh(System.Data.Objects.RefreshMode.StoreWins, drugDetail);
// Set the notes data again
drugDetail.Notes = strNotes;
// Is it possible that DbUpdateConcurrencyException occur again here
dal.SaveChanges();
}
我擔心的是,當SaveChanges()
從catch塊稱爲會再次出現併發衝突。我認爲有可能另一個用戶可以在刷新和保存在catch塊之間修改和保存相同的記錄。
我擔心有效嗎?我無法通過網上搜索找到任何具體的答案。
我正在考慮在我的測試環境中創建這個場景並驗證行爲,但是之後首先想到在這裏查看論壇。
感謝您的幫助。
按照要求DrugDetail類在這裏補充:可在任何時間發生
public partial class DrugDetail
{
public long id { get; set; }
public string DrugName { get; set; }
public Nullable<decimal> Dose { get; set; }
public Nullable<byte> Frequency { get; set; }
public string Method { get; set; }
public string Notes { get; set; }
public byte[] LastUpdated { get; set; }
}
顯示DrugDetail類和配置(屬性和/或FluentApi) –
順便說一句你想要SingleOrDefault()或Single()而不是ToList()[0] –
只是一邊:如果可能'' .ToList()[0];'將返回null,考慮將它改爲').ToList()。FirstOrDefault();' –
Fabulous