2016-03-08 54 views
0

我试图从与其他表与外键共享关系的表中删除记录。因此,在我删除任务记录之前,我先删除其他相关表中的记录,如下面的代码所示。从外键删除记录时从实体框架中的错误

public BusinessResult DeleteTask(int taskID) 
{ 
    Validator validator = new Validator(); 

    if (validator.NotZeroOrLower(taskID, TaskErrors.InvalidTaskID).IsValid) 
    { 
     DBTask dbTask = _TaskRepository.FindBy(task => task.ID == taskID, 
               task => task.WorkProcedureTasks).SingleOrDefault(); 


     if (validator.NullObject(dbTask, false, TaskErrors.InvalidTaskID).IsValid 
       && validator.Bool(dbTask.ClientWorkProcedureTasks.Count == 0, true, TaskErrors.TaskIsInUse).IsValid) 
     { 
      try 
      { 
       if (dbTask.WorkProcedureTasks.Count != 0) 
       { 
        List<int> workProcIDs = dbTask.WorkProcedureTasks.Select(w => w.WorkProcedureID).ToList(); 

        DeleteDependentRecords<DBWorkProcedureTask>(entity => entity.TaskID == taskID); 

        foreach (int workProcID in workProcIDs) 
        { 
         DBWorkProcedure dbWkproc = _WorkProcedureRepository.FindBy(proc => proc.ID == workProcID).First(); 

         dbWkproc.SubJobs.Clear(); 
         _WorkProcedureRepository.Delete(dbWkproc); 
        } 

        _WorkProcedureRepository.Save(); 
       } 

       ClearTasksByType(dbTask.ID); 
       _TaskRepository.Refresh(dbTask);       
       _TaskRepository.Delete(dbTask); 
       _TaskRepository.Save(); 
       dbTask. 
      } 
      catch (Exception e) 
      { 
       string err = e.Message.ToString(); 
      } 
     } 
    } 

    return validator.Result; 
}  

只要代码点击_TaskRepository.Save();崩溃与错误:

The operation failed: The relationship could not be changed because one or more of the foreign-key properties is non-nullable.

当我再次运行该删除过程,它工作正常。 refresh()不起作用,所以我能做些什么才能使其正常工作?

回答

0

你有很多很多,你是不是删除它正确

dbWkproc.SubJobs.Clear(); 

更改为

_context.SubJobs.RemoveRange(dbWkproc.SubJobs) 

或者,如果你没有在上下文中则

_context.Set<SubJobsType>().RemoveRange(dbWkproc.SubJobs) 

原因子作业为什么它抛出的异常是,EF“认为”你将连接到这个链接你的DBWork的表的连接删除Procedure和SubJob类型,而不是删除连接记录,它尝试在该记录中将DbWorkProcedure设置为null