Удаление записи с использованием объекта-заглушки - PullRequest
0 голосов
/ 12 мая 2019

Я видел, и я уверен, что использовал эту технику с 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, чтобы увидеть конфликтующие значения ключей.

1 Ответ

0 голосов
/ 14 мая 2019

ЭТО ОТВЕТ - КОПИЯ ОТ ЗДЕСЬ

Если вы уверены, что все идентификаторы существуют в базе данных, а контекст не содержит (не отслеживает) другие объекты с такими же ключами,Вы можете использовать простые поддельные (заглушки) сущности:

_context.RemoveRange(ids.Select(id => new File { Id = id }));

Чтобы избежать проблемы с отслеживанием сущностей, вы можете использовать пользовательский метод расширения FindTracked из моего ответа на Удалить загруженные и выгруженные объекты по идентификатору в EntityFrameworkCore и объедините его с любым из вышеперечисленных.

var existingIds = _context.Files.Where(f => ids.Contains(f.Id)).Select(f => f.Id).ToList();

_context.RemoveRange(
existingIds.Select(id => _context.FindTracked(id) ?? new File { Id = id }));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...