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



我正在尝试从我的 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 函数及其 ID 的输入来获取项目并尝试删除它。但是,我在管理器上收到此错误。删除:{"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 个对象具有相同的主键?

希望有人能看到这一点。谢谢。

编辑:

当我将我的 Delete 函数更改为以下内容时,我的代码有效:

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 函数?

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 上下文(,因为它已被跟踪。

最新更新