我正在尝试从我的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函数吗?
答案 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上下文中)可以被管理员轻松删除,因为已对其进行了跟踪。