Как удалить отдельную запись из таблицы с помощью EF 6.1.1

Я использую Entity Framework 6.1.1.

Я deleting single record from table как следующий, но я не уверен, является ли его единственным способом или может переписать его эффективным образом.

Может ли кто-нибудь поделиться комментариями?

Причина. Я спрашиваю, потому что многие решения в более ранних сообщениях относятся к EF 4.0 и не используют последнюю версию 6.1.1.

Guid studentId = student.Id;
StudentReportDetail stuDetails = _context.StudentReportDetail.Find(studentId);
if (stuDetails != null)
{
    _context.StudentReportDetail.Remove(stuDetails);
    _context.SaveChanges();
}

Ответ 1

Нет изменений в том, как удалить объект между EF 4 и EF 6. Чтобы удалить объект с использованием Entity Framework, вам нужно использовать метод Remove на DbSet. Remove работает как для существующих, так и для вновь добавленных объектов.

  • Вызов Remove объекта, который был добавлен, но еще не сохранен в базу данных будет отменено добавление объекта. Сущность удаляется из трекера изменений и больше не отслеживается DbContext.

  • Вызов Remove для существующего объекта, который отслеживает изменения зарегистрирует объект для удаления в следующий раз SaveChanges называется.

Удаление с загрузкой из базы данных

В качестве примера, который вы видите в своем вопросе, вам нужно сначала загрузить существующий объект из контекста, чтобы удалить его. Если вы не знаете Id, вы можете выполнить запрос, как показано ниже, чтобы найти его первым:

    var report= (from d in context.StudentReportDetail
               where d.ReportName == "Report"
               select d).Single();

    context.StudentReportDetail.Remove(report);
    context.SaveChanges();

Удаление без загрузки из базы данных

Если вам нужно удалить объект, но его еще нет в памяти, его немного неэффективно, чтобы извлечь этот объект из базы данных только для его удаления. Если вам известен ключ объекта, который вы хотите удалить, вы можете прикрепить заглушку, которая представляет объект, который будет удален, а затем удалить этот заглушка. Штук - это экземпляр объекта, который имеет только присвоенное значение ключа. Ключевое значение - это все, что требуется для удаления объектов.

var toDelete = new StudentReportDetail {Id = 2 };

context.StudentReportDetail.Attach(toDelete);
context.StudentReportDetail.Remove(toDelete);
context.SaveChanges();

Другим способом может быть изменение состояния объекта до Deleted. DbContext имеет методы, называемые Entry и Entry<TEntity>, эти методы получают DbEntityEntry для данного объекта и предоставляют доступ к информации об объекте и вернуть объект DbEntityEntry, способный выполнить действие над сущностью. Теперь вы можете выполнить операцию удаления в контексте, просто изменив состояние объекта на EntityState.Deleted:

var toDelete = new StudentReportDetail {Id = 2 };
context.Entry(toDelete).State = EntityState.Deleted;  
context.SaveChanges();  

Использование сторонней библиотеки

Существует другой способ, но использует стороннюю библиотеку, EntityFramework Plus, есть набор самородок, который вы можете установить. Вы можете использовать операцию пакетного удаления:

context.StudentReportDetail
    .Where(u => u.Id== stuDetails)
    .Delete();