RemoveRange()
を1問合せアプローチで実行する方法を探します。 Remove()
方法で、それは次のように動作します。1問合せアプローチのEntity Framework 6でRemoveRangeを使用する方法
public void Delete()
{
Record record = new Record() {
id = 1,
value = 5
};
using(SomeContext ctx = new SomeContext()) {
ctx.Records.Entry(record).State = EntityState.Deleted;
ctx.SaveChanges();
}
}
しかし、同じアプローチがRemoveRange()
のために動作しません。 EFのドキュメントによると、このメソッドは各エンティティをEntityState.Deleted
に設定します。それは私がそれを理解するようになる場合 - これは動作します:
public void DeleteAll()
{
List<Record> records = new List<Record>() {
new Record() { id = 1, value = 5 },
new Record() { id = 2, value = 10 }
};
using(SomeContext ctx = new SomeContext()) {
ctx.Records.RemoveRange(records);
ctx.SaveChanges();
}
}
これが動作するため:
public void DeleteAll()
{
List<Record> records = new List<Record>() {
new Record() { id = 1, value = 5 },
new Record() { id = 2, value = 10 }
};
using(SomeContext ctx = new SomeContext()) {
foreach(var item in records)
{
ctx.Entry(item).State = EntityState.Deleted;
}
ctx.SaveChanges();
}
}
しかし、それは
The object cannot be deleted because it was not found in the ObjectStateManager.
をせず、例外をスローすることができます私の別のクエリを介してデータベースからすべてを取得せずにこのメソッドを使用しますか?
から取ら
ソリューションは、EFのドキュメント内方法を見つけることができません。カスタムメソッドを意味しますか?それは十分に速いでしょうか? –
EFコアのみの方法かもしれませんが、EF6にない可能性があります。申し訳ありません – Mats391
さて、編集は私が求めていたものです、それは食べ物の練習ですか? 'ctx.Records.Where(dbr => records.Any(r => r.id == dbr.id));'を使ってデータベースからコレクションを取り出すよりも速くなるでしょうか?または状態を変更することは同じですか?データベースからすべてのレコードを取得するためにクエリを実行しますか? –