2017-09-06 80 views
0

我試着用命令的SQL類型使用fromwhere刪除從數據庫中的條目,並將其執行db.SaveChanges()後工作。我已經看到了使用其他示例中,新創建的Person np = new Person() { Name: "sample"};,並把它當作參數傳遞給db.Remove(np)但我抓住這個錯誤刪除條目贏得普遍的應用程序C#

error Database operation expected to affect 1 row(s) but actually affected 0 
row(s). Data may have been modified or deleted since entities were loaded. 

這裏的工作代碼

Person mm = (from pp in db.People where pp.Name == "sample" select pp) 
       .FirstOrDefault(); 
db.People.Remove(mm); 

然而,這並不

var m = new Person() { Name = "sample" }; 
db.Remove(m); 

有人能指導我嗎?謝謝。

回答

0

您正試圖刪除沒有提供ID的記錄。沒有Id時不能刪除記錄。

第一種情況是因爲您從數據庫中選擇了人員。所以Person對象包含(或應包含)的Id。

第二段代碼只是創建一個新的Person而不插入到DB中。

var id = (from pp in db.People where pp.Name == "sample" select pp).FirstOrDefault().Id; //Get id from person with name "sample" 
    var m = new Person() {Id = id}; 
    db.People.Remove(m); 
+0

嗯,我只是嘗試這一次,仍然不工作,當然 – Gibs

+0

好ID應該在你的數據庫 – DenseCrab

+0

更新使用您的姓名==「樣品」的存在。它從具有名稱樣本的人那裏獲得Id,然後從表中刪除它。 – DenseCrab

0

如果你想使用DbContext.Remove方法刪除條目,你應該能夠ID設置爲人。

如果我們得到的ID,並將其設置爲Person並調用DbContext.Remove,它會拋出System.InvalidOperationException

人「的實體類型的實例「不能因爲這種類型的另一個實例進行跟蹤同一把鑰匙已經被追蹤。 當添加新實體時,對於大多數鍵類型,如果未設置鍵(即,如果鍵屬性被指定爲其類型的默認值),則將創建唯一的臨時鍵值。 如果您明確設置新實體的關鍵值,請確保它們不與現有實體衝突或爲其他新實體生成的臨時值衝突。 當附加現有實體時,確保只有一個具有給定鍵值的實體實例附加到上下文。

如果當前DbContext被釋放,我們可以創建我們使用DbContext.Remove法新DbContext。如果您知道該人員的ID,則可以使用DbContext.Remove方法。否則,不推薦。

下面的代碼工作:

int myId; 
using (var db = new BloggingContext()) 
{ 
    var id = (from pp in db.People where pp.Name == "sample" select pp).FirstOrDefault().PersonId; 
    myId = id; 
}  
using (var db = new BloggingContext()) 
{ 
    var person = new Person() { PersonId = myId}; 
    db.Remove(person); 
    db.SaveChanges(); 
}