Невозможно удалить объект, так как он не был найден в ошибке ObjectStateManager при удалении элемента - PullRequest
0 голосов
/ 27 августа 2018

Я пытаюсь удалить элемент из моей таблицы AspNetRoles, который был расширен следующим образом:

public class AspApplicationRoles : IdentityRole
{
    public AspApplicationRoles() : base() { }
    public AspApplicationRoles(String Name) : base(Name) { }
    [Required]
    public String ApplicationId { get; set; }
    public AspNetApplications Application { get; set; }
}

Это способ, которым я пытаюсь удалить его.Я использую функцию Get с вводом его идентификатора, чтобы получить элемент и пытаюсь удалить его.Тем не менее, я получаю эту ошибку в manager.Delete: {"The object cannot be deleted because it was not found in the ObjectStateManager."}

    public RolesDetailsViewModel Get(String Input)
    {
        AspApplicationRoles data = new AspApplicationRoles() ;
        RolesDetailsViewModel rdvm = new RolesDetailsViewModel();
        try
        {
            data = dbContext.AspApplicationRoles.Single(r => r.Id == Input);
            rdvm = new RolesDetailsViewModel
            {
                ApplicationId = data.ApplicationId,
                Id = data.Id,
                RoleName = data.Name
            };
        }
        catch (Exception e)
        {
            logger.Error(e, AspNetEventLogs.NotFound);
        }
        return rdvm;
    }

    public void Delete(String Input)
    {
        var store = new RoleStore<AspApplicationRoles>(dbContext);
        var manager = new RoleManager<AspApplicationRoles>(store);
        try
        {
            var role = Get(Input);
            var r = new AspApplicationRoles
            {
                Id = role.Id,
                ApplicationId = role.ApplicationId,
                Name = role.RoleName
            };
            manager.Delete(r);
            logger.Info(AspNetEventLogs.Delete + " Role: " + role.RoleName);
        }
        catch (Exception e)
        {
            logger.Error(e, "Failed to delete Role");
        }
    }

Я пытался найти решение, но если я использую функцию dbContext.Attach, я получаю еще одну ошибку, которая утверждает, что есть2 объекта с одинаковым первичным ключом?

Надеюсь, кто-нибудь увидит это.Спасибо.

РЕДАКТИРОВАТЬ:

Мой код работает, когда я меняю свою функцию удаления на это:

    public void Delete(String Input)
    {
        var store = new RoleStore<AspApplicationRoles>(dbContext);
        var manager = new RoleManager<AspApplicationRoles>(store);
        try
        {
            var role = dbContext.AspApplicationRoles.Single(r => r.Id == Input);
            manager.Delete(role);
            logger.Info(AspNetEventLogs.Delete + " Role: " + role.Name);
        }
        catch (Exception e)
        {
            logger.Error(e, "Failed to delete Role");
        }
    }

Однако возможно ли использовать мою функцию Get вместокаждый раз вызывать функцию LINQ?

1 Ответ

0 голосов
/ 27 августа 2018

RoleManager.Delete звонит RoleStore.Delete, что в итоге вызывает DbSet<Role>.Remove(role). Как уже упоминалось в DbSet<T>.Remove(T), то, что вы передаете сущности, должно существовать в контексте в каком-то другом состоянии до вызова этого метода.

Очевидно, что экземпляр роли, который вы создаете с помощью new Role(), не существует в контексте. Поэтому следующая строка кода выдаст исключение:

var r = new Role(){ ... };
manager.Delete(r); // ← throws exception

Выше описание также описывает, почему ваш отредактированный код работает, потому что вы загружаете роль в контекст, а затем пытаетесь удалить эту прикрепленную (отслеживаемую) роль.

Если вы хотите повторно использовать созданный вами метод Get, он должен вернуть Role или иметь ссылку на Role в возвращаемом значении. Затем эта ссылка (которая была прикреплена к контексту EF) может быть легко удалена менеджером, поскольку она отслежена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...