Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.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
.net 实体框架,更新和保存使用SelectMany检索的对象上的更改不起作用_.net_Entity Framework - Fatal编程技术网

.net 实体框架,更新和保存使用SelectMany检索的对象上的更改不起作用

.net 实体框架,更新和保存使用SelectMany检索的对象上的更改不起作用,.net,entity-framework,.net,Entity Framework,情景1://在这种情况下,训练不会从数据库中删除 Season season = dbContext.Seasons.Find(58); var ps1 = season.PlannerSeason; PlannerWorkout pworkoutToRemove = ps1.Weeks.SelectMany(w => w.WeekDays.SelectMany(wd => wd.PlannerWorkouts)).Where(pw => pw.WorkoutID == 361

情景1://在这种情况下,训练不会从数据库中删除

Season season = dbContext.Seasons.Find(58);
var ps1 = season.PlannerSeason;
PlannerWorkout pworkoutToRemove = ps1.Weeks.SelectMany(w => w.WeekDays.SelectMany(wd => wd.PlannerWorkouts)).Where(pw => pw.WorkoutID == 3615).FirstOrDefault();
bool isRemoved = ps1.Weeks.SelectMany(w => w.WeekDays.SelectMany(wd => wd.PlannerWorkouts)).ToList().Remove(pworkoutToRemove);

dbContext.SaveChanges(); //does not work
情景2://此处检索完全相同的训练并从db中删除。它起作用了

Season season = dbContext.Seasons.Find(58);
var ps1 = season.PlannerSeason;
PlannerWeek pweek = ps1.Weeks.Find(w => w.WeekNo == 14);
PlannerWeekDay pwd = pweek.WeekDays.Find(d => d.DayNo == 1);
PlannerWorkout pworkoutToRemove = pwd.PlannerWorkouts.Find(pw => pw.WorkoutID == 3615);
bool isRemoved = pwd.PlannerWorkouts.Remove(pworkoutToRemove);

dbContext.SaveChanges(); //works

通过SelectMany检索单个对象会有区别吗?

问题不在于使用
SelectMany检索对象,而是在这里

bool isRemoved = ps1.Weeks.SelectMany(w => w.WeekDays.SelectMany(wd => wd.PlannerWorkouts))
    .ToList() // <--
    .Remove(pworkoutToRemove);
换句话说,您正在创建一个临时列表并从该列表中删除对象,而不是像工作示例中那样从父集合中删除对象

如果您对父
工作日
具有反向导航属性,则可以使用此属性

bool isRemoved = pworkoutToRemove != null &&
    pworkoutToRemove.WeekDay.PlannerWorkouts.Remove(pworkoutToRemove);
或者您可以直接从相应的
DbSet
中将其删除:

bool isRemoved = false;
if (pworkoutToRemove != null)
{
    dbContext.PlannerWorkouts.Remove(pworkoutToRemove);
    isRemoved = true;
}
或将实体状态设置为“已删除”

bool isRemoved = false;
if (pworkoutToRemove != null)
{
    dbContext.Entry(pworkoutToRemove).State = EntityState.Deleted;
    isRemoved = true;
}
bool isRemoved = false;
if (pworkoutToRemove != null)
{
    dbContext.Entry(pworkoutToRemove).State = EntityState.Deleted;
    isRemoved = true;
}