我在我的VS項目中使用了本地數據庫的實體框架的ADO.NET實體數據模型。只有一個包含兩個複合主鍵(UserId,Data)和一個可修改字段(Status)的表。更新一條記錄觸發實體框架中相同主鍵之一的所有記錄的更改
問題是,當我嘗試檢索一個特定的記錄並修改其「狀態」字段時,同一UserId的所有「狀態」都會改變,而不管它們的數據值如何。 (但是不同的用戶ID下的記錄留不受影響。)更新代碼如下:
public void updateStatus(string userId, string data, short status)
using (var context = new MyDBContext()) {
var data = context.UserDataStatus.Single(s => s.UserId == userId && s.Data == data);
data.Status = status;
context.UserImageStatus.Attach(data);
context.Entry(data).Property(p => p.Status).IsModified = true;
context.SaveChanges();
}
}
我嘗試了許多不同的方法來更新記錄,如使用.Where().FirstDefault()
檢索記錄,而不是Single()
,或添加.AsNoTracking()
之後我的context.UserDataStatus
。然而,它也沒有工作。
我發現有時實體框架無法正確處理重複/無主鍵,例如,我必須在查詢中添加.AsNoTracking()
作爲從同一數據庫檢索數據時的解決方法。我想知道是否是導致更新問題的相同原因,以及如何解決它?
====
更新時間:
好了,終於我找到了問題是由自動生成的EF模型只給了用戶ID作爲主鍵造成的。儘管我在.edmx中選擇了「從數據庫更新模型」,但主鍵完全沒有更新。所以我去了.edmx模型瀏覽器,手動更新「Data」字段的屬性,問題就解決了。我的查詢中也不必再使用.AsNoTracking()
。