添加一个集合,需要循环吗?

时间:2009-12-01 15:12:45

标签: entity-framework

我有这段代码:

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

5 个答案:

答案 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.Timetablesschedule.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); 
  }

在开始修改集合之前,请先列举集合。