我遇到了一些問題讓EntityFramework做我想做的事情。我有一個對象,我想跟蹤當前和以前的狀態。因此,當有更新以前的狀態將不是被更改爲當前狀態和當前狀態成爲新對象是這樣的:EF6代碼首先,存儲更新,插入或刪除語句影響了意想不到的行數(0)
using (var db = new DBContext())
{
var currentPair = await db.CurrencyPairs.Include(c => c.CurrentRate).Include(c => c.PreviousRate).SingleAsync(p => p.CurrencyPairId == pair.CurrencyPairId);
var newRate = new ExchangeRate()
{
CurrencyPairId = currentPair.CurrencyPairId,
HighestBid = t.HighestBid,
LowestAsk = t.LowestAsk,
Last = t.LastPrice,
Volume = t.DailyVolume,
UpdateTime = DateTime.UtcNow
};
if (currentPair.AveragePrice == null || (DateTime.UtcNow - DateTime.Parse(db.Store.Single(s => s.Key == "CurrentStartTime").Value)).TotalHours < 4)
currentPair.AveragePrice = (t.DailyHigh + t.DailyLow)/2;
currentPair.PreviousRate = currentPair.CurrentRate;
currentPair.CurrentRate = newRate;
await db.SaveChangesAsync();
}
的問題是儲蓄時,我得到一個錯誤的EntityFramework:
存儲更新,插入或刪除語句影響意外 行數(0)。自從裝載了實體 以來,實體可能已被修改或刪除。
ExchangeRate對象具有標識列,因此ID應自動填充。此線程是唯一設置CurrentRate/PreviousRate屬性的線程,還有其他線程可以讀取它們。
任何人都知道我做錯了什麼線索?
編輯:EXCHANGERATE對象
public class ExchangeRate
{
[Key]
public long ExhangeRateId { get; set; }
public double HighestBid { get; set; }
public double LowestAsk { get; set; }
public double Volume { get; set; }
public double Last { get; set; }
public DateTime UpdateTime { get; set; }
public long CurrencyPairId { get; set; }
}
常常通過導致此錯誤忘了包括在用戶輸入或標識列不排除用於數據綁定標識列。你有什麼樣的用戶輸入以及ExchangeRate表類的外觀如何? –
沒有用戶輸入,此代碼是websocket消息的事件處理程序。 currentPair對象來自數據庫,所以它應該有一個ID。 PreviousRate也是一個已經存在的數據庫對象,並且應該有一個ID,並且newRate對象正在添加一個標識列,以便獲得生成的ID。或者我的理解如此。我在 –
這個問題中添加了ExchangeRate類我認爲'currentPair'中的一些屬性已經改變,請嘗試在'SaveChangesAsync':'db.Entry(currentPair).State = EntityState.Modified'之前使用修改的實體狀態。它與數據併發性有關,同時用異步模式保存。 –