我有这段代码:
Schedule s = _entities.Schedules.Where(x => x.ScheduleID == schedule.ScheduleID && x.BookingObject.BookingObjectID == bookingObjectID).FirstOrDefault();
if(s == null)
s = new Schedule();
s.ScheduleStart = schedule.ScheduleStart;
s.ScheduleEnd = schedule.ScheduleEnd;
foreach (var t in schedule.Timetables)
{
s.Timetables.Add(t);
}
_entities.AddToSchedules(s);
_entities.SaveChanges();
异常:System.InvalidOperationException
对象计划作为参数传递
编辑:
更改为:
Schedule sh = new Schedule();
sh.ScheduleStart = schedule.ScheduleStart;
sh.ScheduleEnd = schedule.ScheduleEnd;
foreach (var t in schedule.Timetables)
{
//sh.Timetables.Add(t); // doesn't work
sh.Timetables.Add(new Timetable { DayOfWeek = t.DayOfWeek, StartTime = t.StartTime, EndTime = t.EndTime }); // works
}
_entities.AddToSchedules(sh);
_entities.SaveChanges();
是否有一些合理的理由说明为什么sh.Timetables.Add(t)因为它的时间表集合而无效?
/ M
答案 0 :(得分:2)
foreach(var time in schedule.Timetables){
s.Timetables.Add(time)
}
您可以循环调度schedule.Timetables中的时间表,并将它们添加到新实体中。
答案 1 :(得分:1)
s.Timetables.Add(schedule.Timetables)
如果不是这种情况,那么您的问题可能需要更多信息。什么是s.Timetables,schedule.Timetables? (类型)
答案 2 :(得分:1)
另一种选择是:
((List<TimeTable>)s.Timetables).AddRange(((List<TimeTable>)schedule.Timetables));
答案 3 :(得分:1)
看看前几行:
Schedule s = _entities.Schedules.Where(x => x.ScheduleID == schedule.ScheduleID && x.BookingObject.BookingObjectID == bookingObjectID).FirstOrDefault();
if(s == null)
s = new Schedule();
在第一行,您要查询数据库中是否有与schedule
相同的ScheduleID的对象,并将返回的引用存储在s
中。假设该对象在数据库中可用,您实际上将s
指向与schedule
相同的对象。这意味着s.Timetables
和schedule.Timetables
是相同的集合,这将导致您在foreach期间获得的异常。
我假设您只想克隆schedule指向的对象,并将其插入数据库(如果它尚未存在于数据库中)。在那种情况下:
Schedule s = _entities.Schedules.Where(x => x.ScheduleID == schedule.ScheduleID && x.BookingObject.BookingObjectID == bookingObjectID).FirstOrDefault();
if(s == null)
{
s = new Schedule();
s.ScheduleStart = schedule.ScheduleStart;
s.ScheduleEnd = schedule.ScheduleEnd;
foreach (var t in schedule.Timetables)
{
s.Timetables.Add(t);
}
_entities.AddToSchedules(s);
_entities.SaveChanges();
}
答案 4 :(得分:1)
更新:刚刚确认这可能是原因。并在tip中创建了一个新的my tips series来解释。
我可以想到一个可能的原因。schedule.Timetables
一对多的关系是什么?即时间表一次只能分配给一个时间表吗?
如果是这样,那就失败了:
foreach (var t in schedule.Timetables) {
sh.Timetables.Add(t);
}
因为当您将't'添加到不同的计划时,它会自动从旧的schedule.Timetables
集合中删除,这当然会修改您要枚举的集合,这是禁止的。
如果是这样,解决方案只是做这样的事情:
var timetables = schedule.Timetables.ToArray();
foreach (var t in timetables) {
sh.Timetables.Add(t);
}
在开始修改集合之前,请先列举集合。