2017-04-08 68 views
1

我在我的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()

回答

1

那麼,最後我發現問題是由於自動生成的EF模型只給出了UserId作爲主鍵。儘管我在.edmx中選擇了「從數據庫更新模型」,但主鍵完全沒有更新。所以我去了.edmx模型瀏覽器,手動更新「Data」字段的屬性(將其設置爲主鍵),問題就解決了。我的查詢中也不必再使用.AsNoTracking()

相關問題