2017-09-06 81 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(); 
}