2017-06-06 46 views
0

我有兩個具有多對多關係的實體(TaskStep和Role),我使用一個視圖模型(名爲StepViewModel)來顯示taskstep,它允許角色,StepViewModel是:通過實體框架中的視圖模型保存很多關係6

public class StepViewModel 
{ 
    public StepViewModel() 
    { 

    } 
    public TaskStep TaskStep { get; set; } 

    public virtual ICollection<AllowedRole> AllowedRole { get; set; } 

} 

,我用這個方法來顯示taskstep:

public static StepViewModel GetTaskStepData(int stepId) 
    { 
     using (var context = new WFContext()) 
     { 

      return context.TaskSteps.Where(ts => ts.ID == stepId).Include(ts => ts.Roles) 
       .Select(ts => new StepViewModel() 
       { 
        AllowedRole = context.Roles.Select(r => new AllowedRole() 
        { 
         Role = r, 
         Allowed = ts.Roles.Select(x => x.ID).Contains(r.ID) 
        }).ToList(), 
        TaskStep = ts 
       }) 
       .SingleOrDefault(); 
     } 
    } 

但是當我保存taskstep,它的角色轉變不保存。我的保存方法是:

public static void SaveTaskStep(StepViewModel stepViewModel) 
    { 
     using (var context = new WorkFlowContext()) 
     { 

      //TaskStep taskStep = context.TaskSteps.Where(ts => ts.ID == stepViewModel.TaskStep.ID).Include(ts => ts.Roles).SingleOrDefault(); 

      TaskStep taskStep = stepViewModel.TaskStep; 

      List<int> aRolesIDs = stepViewModel.AllowedRole.Where(ar => ar.Allowed == true).Select(ar => ar.Role.ID).ToList(); 
      List<Role> roles = context.Roles.Where(r => aRolesIDs.Contains(r.ID)).Include(r => r.AllowedTaskSteps).ToList(); 

      taskStep.Roles.Clear(); 
      foreach (Role role in roles) 
      { 
       if (context.Entry(role).State == EntityState.Detached) 
        context.Roles.Attach(role); 

       taskStep.Roles.Add(role); 
      } 

      if (taskStep.ID == 0) 
       context.TaskSteps.Add(taskStep); 
      else 
       context.Entry(taskStep).State = EntityState.Modified; 

      context.SaveChanges(); 
     } 
    } 

,如果我從數據庫獲取與包括taskstep角色(如在保存方法首先-comment-線),它工作的很好。但通過這種方式,我必須手動完成所有任務步驟字段的更改。另外,當我將任務步驟分配給stepviewmodel時,我使用「include」,但它仍然不起作用。我該如何保存stepViewModel角色?

回答

0

context.TaskSteps.Attach(taskStep)應該在你的情況下工作

SaveTaskStep方法:

using (var context = new WorkFlowContext()) 
{ 
    TaskStep taskStep = stepViewModel.TaskStep; 
    if (taskStep.ID == 0) 
    context.TaskSteps.Add(taskStep); 
    else 
    context.TaskSteps.Attach(taskStep); //from this point EF start change tracking 

//I just copy-pasted this part your code assuming it's correct 
    List<int> aRolesIDs = stepViewModel.AllowedRole.Where(ar => ar.Allowed == true).Select(ar => ar.Role.ID).ToList(); 
    List<Role> roles = context.Roles.Where(r => aRolesIDs.Contains(r.ID)).Include(r => r.AllowedTaskSteps).ToList(); 

    taskStep.Roles.Clear(); 
    foreach (Role role in roles) 
    { 
    if (context.Entry(role).State == EntityState.Detached) 
     context.Roles.Attach(role); 

     taskStep.Roles.Add(role); 
    } 

    context.SaveChanges(); 
} // end of using (var context 
+0

它工作的很好,當taskstep插入,而不是編輯taskstep(像我的代碼)。 –

+0

@MasoumehKarvar是否在我的例子之前的任何其他操作之前調用'Attach'?還要確保在你的'TaskStep'類中標記爲'virtual'的'Roles'集合 –