2017-09-06 4 views
0

fromwhereを使用してSQLタイプのコマンドを使用してデータベースからエントリを削除しようとしましたが、db.SaveChanges()を実行した後に機能しました。私はここで作業コードがcontext.remove(class)を使用してデータベース内のエントリを削除するC#

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

だが、これは

ない、新しく作成された Person np = new Person() { Name: "sample"};を使用して他の例を見て db.Remove(np)にパラメータとして渡すが、私はこのエラーに

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. 

をキャッチしていています

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

誰かが私に教えてもらえますか?ありがとうございました。

答えて

0

IDを指定せずにレコードを削除しようとしています。 Idを持たないレコードは削除できません。

最初のケースは、データベースからPersonを選択したために機能します。そのため、Personオブジェクトには、(含まれている必要があります)のIDがです。

2番目のコードは、DBに挿入することなく新しいPersonを作成するだけです。あなたは、エントリを削除するにはDbContext.Removeメソッドを使用する場合は

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

うーん私はこの1つだけを試してみましたが、まだIdは – Gibs

+0

まあ動作しません。名前サンプルを持つ人物からIDを取得し、それをテーブルから削除します。 – DenseCrab

+0

が==「サンプルを」自分の名前を使用するように更新し、データベースに存在している必要があり、もちろん – DenseCrab

0

、あなたは人にIDを設定することができるはずです。

我々はIDを取得し、Personに設定してDbContext.Removeを呼び出した場合、それがスローされますSystem.InvalidOperationException

人 『「エンティティタイプのインスタンスは』このタイプの別のインスタンスために追跡することはできません

同じキーが既に追跡されています。 新しいエンティティを追加する場合、ほとんどのキータイプで、キーが設定されていない場合(つまり、キープロパティにそのタイプのデフォルト値が割り当てられている場合)、一意の一時キー値が作成されます。 新しいエンティティのキ​​ー値を明示的に設定する場合は、既存のエンティティまたは他の新しいエンティティ用に生成された一時的な値と衝突しないようにします。 既存のエンティティを追加する場合は、特定のキー値を持つエンティティインスタンスが1つだけコンテキストに関連付けられていることを確認してください。

現在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(); 
} 
関連する問題