Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在实体框架中实现RemoveRange_C#_Entity Framework 6 - Fatal编程技术网

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方法。