C# 在实体框架中实现RemoveRange
我正在尝试从数据库中删除记录范围,并尝试以下方法:C# 在实体框架中实现RemoveRange,c#,entity-framework-6,C#,Entity Framework 6,我正在尝试从数据库中删除记录范围,并尝试以下方法: public void DeleteAllRolesFromUser(int userId, FilterDto filter) { var unitOfWork = _serviceLocator.Resolve<IUnitOfWork>(); var filterValidatorService = _serviceLocator.Resolve<IFilt
public void DeleteAllRolesFromUser(int userId, FilterDto filter)
{
var unitOfWork = _serviceLocator.Resolve<IUnitOfWork>();
var filterValidatorService = _serviceLocator.Resolve<IFilterValidatorService>();
// Prep filter if properties are null
filter = filterValidatorService.ValidateListFilter(filter);
var userRoles = GetUserRoles(userId, filter);
var usersAllRoles = new List<UserRole>();
foreach (RoleDto role in userRoles)
{
var UserRole = new UserRole();
UserRole.RoleId = role.Id;
UserRole.UserId = userId;
usersAllRoles.Add(UserRole);
}
// Delete user role
unitOfWork.UserRoles.RemoveRange(usersAllRoles);
// Perform changes
unitOfWork.SaveChanges();
}
其中UserRole和RoleDto类似:
public class UserRole : IdentityUserRole<int>, IModelWithId
{
public int Id {get; set; }
public int UserId { get; set; }
public virtual User User { get; set; }
public int RoleId { get; set; }
public virtual Role Role { get; set; }
}
public class RoleDto : IModelWithId
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public bool Active { get; set; }
public bool CanExport { get; set; }
public int? UserCount { get; set; }
}
我收到错误:无法删除该对象,因为在ObjectStateManager中找不到它。为什么不直接删除它
unitOfWork.UserRoles.RemoveRange(unitOfWork.UserRoles.where(r=>r.UserId==userId));
出现错误是因为新的UserRole对象刚刚创建,而您没有从dbcontext中获取它们。因此,它们需要以某种方式链接到dbcontext。“附加”功能正是出于这个原因
试着打电话
foreach (RoleDto role in userRoles)
{
var UserRole = new UserRole();
UserRole.RoleId = role.Id;
UserRole.UserId = userId;
usersAllRoles.Add(UserRole);
unitOfWork.UserRoles.Attach(UserRole);
}
// Delete user role
unitOfWork.UserRoles.RemoveRange(usersAllRoles);
这意味着实体没有被附加,它没有被相同的上下文加载。 试试这个:
foreach (RoleDto role in userRoles)
{
var UserRole = new UserRole();
UserRole.RoleId = role.Id;
UserRole.UserId = userId;
unitOfWork.UserRoles.Attach(UserRole);
unitOfWork.Entry(UserRole).State = EntityState.Deleted;
}
unitOfWork.SaveChanges();
我用另一种方式。我在列表中使用userId获得所有记录,然后使用RemoveRange运行良好,没有错误
var userRoles = unitOfWork.UserRoles.GetByUserId(userId).ToList();
// Delete user role
unitOfWork.UserRoles.RemoveRange(userRoles);
// Perform changes
unitOfWork.SaveChanges();
UserRoles是一个存储库,它没有Where方法。