无法删除该对象,因为删除项目时在ObjectStateManager错误中找不到该对象

时间:2018-08-27 12:31:40

标签: c# asp.net asp.net-mvc entity-framework

我正在尝试从我的AspNetRoles表中删除一项已扩展为以下内容的项目:

JST...

这是我尝试删除它的方法。我使用带有ID输入的Get函数来获取项目并尝试将其删除。但是,我在manager处收到此错误。删除:public class AspApplicationRoles : IdentityRole { public AspApplicationRoles() : base() { } public AspApplicationRoles(String Name) : base(Name) { } [Required] public String ApplicationId { get; set; } public AspNetApplications Application { get; set; } }

{"The object cannot be deleted because it was not found in the ObjectStateManager."}

我尝试寻找一种解决方案,但是如果使用dbContext.Attach函数,则会收到另一个错误,指出存在两个具有相同主键的对象?

希望有人可以看到这个。谢谢。

编辑:

当我将Delete函数更改为此时,我的代码有效:

    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");
        }
    }

但是,可以重用我的Get函数而不是每次都调用LINQ函数吗?

1 个答案:

答案 0 :(得分:1)

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上下文中)可以被管理员轻松删除,因为已对其进行了跟踪。