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
この作品の罰金taskstep挿入ではなく、(私のコードのような)編集taskstepのために: –
@MasoumehKarvarは私の例のような他のアクションの前に 'Attach'を呼び出しましたか? 'TaskStep'クラス' Roles'コレクションに 'virtual'とマークされていることを確認してください –