Экземпляр типа сущности Menu не может быть отслежен - PullRequest
0 голосов
/ 24 октября 2019

Я начал новый основной проект asp.net. Как вы знаете, в Core версии 2.1 есть внедрение зависимостей.

У меня есть модель под названием MenuModel для создания таблицы в моей базе данных. Я добавил интерфейс под названием IMenuRepository для моей модели и вызов класса MenuRepository, который реализует мой интерфейс.

Я пытаюсь отредактировать свое меню в своем хранилище следующим образом:

    public async Task Edit(Menu menu)
    {
        menu.UpdatedBy = _userId;
        menu.UpdatedDate = DateTime.Now;

        _db.Entry(menu).State = EntityState.Modified;
        await _db.SaveChangesAsync();
    }

Я добавил эту строкукод для моего startup.cs для внедрения зависимостей

services.AddTransient<IMenuRepository, MenuRepository>();

Я нашел другой вопрос, который задал тот же вопрос, и в ответ сказано, что я должен изменить свой код startup.cs, например:

services.AddScoped<IMenuRepository, MenuRepository>();

Я сделал и попробовал другие, но я получаю эту ошибку всегда. Я искал пару раз, но не могу найти решение своей проблемы.

Однажды я отсоединил свою модель от DatabaseContext перед редактированием, и я тоже получил ту же ошибку.

Я попытался с помощью этого кода обновить, но безрезультатно

_db.Update(menu);

Вот мое описание ошибки:

** Произошло необработанное исключение при обработке запроса.

InvalidOperationException:Экземпляр типа объекта «Меню» не может быть отслежен, потому что другой экземпляр с таким же значением ключа для {'MenuId'} уже отслеживается. При подключении существующих объектов убедитесь, что подключен только один экземпляр объекта с данным значением ключа. Подумайте об использовании DbContextOptionsBuilder.EnableSensitiveDataLogging, чтобы увидеть конфликтующие значения ключей. Microsoft.EntityFrameworkCore.ChangeTracking.Internal.IdentityMap.ThrowIdentityConflict (запись InternalEntityEntry) **

С другой стороны, у меня есть часть кода для публикации и отмены публикации меню, которое изменяет статус записи и редактирует менювот так и работает отлично.

    public async Task Publish(int id)
    {
        Menu menu = await Find(id);

        menu.UpdatedBy = _userId;
        menu.UpdatedDate = DateTime.Now;
        menu.Status = eStatus.Published;

        _db.Entry(menu).State = EntityState.Modified;
    }

Разница только в том, что я отправляю идентификатор меню для публикации метода и отправляю меню obj для редактирования.

1 Ответ

0 голосов
/ 24 октября 2019

После поиска на разных языках я нашел ответ на свой вопрос

Я изменил свой метод редактирования на этот:

    public async Task Edit(Menu menu)
    {
        menu.UpdatedBy = _userId;
        menu.UpdatedDate = DateTime.Now;

        var editVersion = await Find(menu.MenuId);
        if (editVersion != null)
        {
            _db.Entry(editVersion).CurrentValues.SetValues(menu);
        }
        await _db.SaveChangesAsync();
    }
...