Я видел, и я уверен, что использовал эту технику с EF Core для удаления записи, создав объект-заглушку для сохранения поездки в БД, но использование этого метода никогда не отправляет удаление в БД. Кто-нибудь знает почему?
public void DeleteById(int blogPostId)
{
// Does not work
// Use Stub to save extra db trip
/*
var blogPost = new BlogPost { Id = blogPostId };
_context.Entry(blogPost).State = EntityState.Deleted;
_context.BlogPosts.Remove(blogPost);
_context.SaveChanges();
*/
// Works
var blogPost = _context.BlogPosts.Find(blogPostId);
_context.Entry(blogPost).State = EntityState.Deleted;
_context.BlogPosts.Remove(blogPost);
_context.SaveChanges();
}
В качестве дополнительного вопроса, в чем разница между использованием remove непосредственно в контексте или в DbSet, поскольку оба работают нормально?
_context.Remove(blogPost);
_context.BlogPosts.Remove(blogPost);
Если я изменю код на следующий:
public void DeleteById(int blogPostId)
{
// Does not work
// Use Stub to save extra db trip
var blogPost = new BlogPost { Id = blogPostId };
//_context.Entry(blogPost).State = EntityState.Deleted;
_context.BlogPosts.Remove(blogPost);
_context.SaveChanges();
// Works
//var blogPost = _context.BlogPosts.Find(blogPostId);
//_context.Entry(blogPost).State = EntityState.Deleted;
//_context.BlogPosts.Remove(blogPost);
//_context.SaveChanges();
}
Я получаю ошибку ниже:
An unhandled exception has occurred while executing the request.
System.InvalidOperationException: экземпляр типа сущности 'BlogPost' не может быть отслежен, поскольку другой экземпляр с тем же значением ключа для {'Id'} уже отслеживается. При подключении существующих объектов убедитесь, что подключен только один экземпляр объекта с данным значением ключа. Подумайте об использовании DbContextOptionsBuilder.EnableSensitiveDataLogging, чтобы увидеть конфликтующие значения ключей.