2017-06-06 4 views
0

多くのリレーションを持つ2つのエンティティ(TaskStepおよびRole)があり、ビュー・モデル(StepViewModel)を使用してタスク・ステップを表示し、ロールを許可しました。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(); 
     } 
    } 

私はとDBからtaskstepを取得する場合(Saveメソッドの最初の-comment-ラインのような)役割を含め、それがうまく働くの。このようにして、すべてのタスクステップフィールドの変更を手動で行う必要があります。さらに、stepviewmodelにtaskstepを割り当てると、「インクルード」が使用されますが、まだ動作しません。ステップビューモデルの役割を保存するにはどうすればよいですか?

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

context.TaskSteps.Attach(taskStep)

はあなたのケースで

SaveTaskStep方法を動作するはずです。

+0

この作品の罰金taskstep挿入ではなく、(私のコードのような)編集taskstepのために: –

+0

@MasoumehKarvarは私の例のような他のアクションの前に 'Attach'を呼び出しましたか? 'TaskStep'クラス' Roles'コレクションに 'virtual'とマークされていることを確認してください –

関連する問題