Есть ли способ, которым я могу сказать EF, чтобы не беспокоиться о количестве строк a DELETE
или UPDATE
делать или не делать?
Я пытаюсь удалить строку из базы данных, но из-за того, что строка не существует, EF генерирует исключение: DbUpdateConcurrencyException
.. говоря, что были затронуты 0 строк. Это правильно → ни одна строка не была удалена. Но это совершенно нормально.. потому что нет данных.
Я действительно не хочу совершать кругосветное путешествие к БД, чтобы увидеть, существует ли эта строка.. и если да, тогда попробуйте и удалите ее.
Если я попытаюсь усвоить исключение в блоке try / catch
, тогда остальные элементы, которые нужно удалить, НЕ отправляются в db, когда я пытаюсь SaveChanges()
... что плохо.
например.
Delete(new Foo(1));
Delete(new Foo(2));
Delete(new Foo(3));
SaveChanges(); // <-- Throws the exception.
// DB Trace : DELETE FROM Foo WHERE Id = 1;
и т.д. там нет трассы, показывающей запись 2 или 3, пытающуюся удалить... поскольку исключение останавливает все: (
Любые идеи?
UPDATE
Как работает DELETE
? Здесь код... (упрощенный и строго типизированный)
public void Delete(Foo foo)
{
if (foo == null)
{
throw new ArgumentNullException("foo");
}
Foo attachedEntity = Context.Set<Foo>().Local.FirstOrDefault(x => x.Id > 0);
if (attachedEntity != null)
{
// Entity already in object graph - remove entity.
Context.Set<Foo>().Remove(attachedEntity);
}
else
{
// Entity not in object graph, attach and set EntityState to Deleted.
Context.Entry(foo).State = EntityState.Deleted;
}
}