2009-12-01 5 views
1

J'ai ce code:Ajout d'une collection, boucle nécessaire?

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(); 

Exception: System.InvalidOperationException

le calendrier d'objet est transmis en tant que paramètre

EDIT:

changé:

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(); 

est-il un peu logica l raison pour laquelle sh.Timetables.Add (t) ne fonctionne pas puisque c'est une collection de Timetable?

/M

Répondre

1

MISE À JOUR: vient de confirmer que cela est susceptible d'être la raison. Et créé un nouveau tip en my tips series pour expliquer.

Je peux penser à une raison possible. Est la relation entre schedule.Timetables un à plusieurs? C'est à dire. Un horaire peut-il être affecté à un seul horaire à la fois?

Si oui, ce ne parvient pas:

foreach (var t in schedule.Timetables) {  
    sh.Timetables.Add(t); 
    } 

Parce que vous ajoutez le « t » à un calendrier différent, il est automatiquement retiré de l'ancienne collection schedule.Timetables, ce qui bien sûr modifie la collection que vous énumérez , qui est un non-non.

Si oui, la solution est tout simplement de faire quelque chose comme ceci:

var timetables = schedule.Timetables.ToArray(); 
    foreach (var t in timetables) {  
    sh.Timetables.Add(t); 
    } 

vous énumérez ici la collection, avant de commencer à le modifier.

1
s.Timetables.Add(schedule.Timetables) 

si ce n'est pas le cas, il est probable que votre question a besoin de plus d'informations. Qu'est-ce que s.Timetables, schedule.Timetables? (types)

+0

schedule.Timetables est un Entitycollection et je ne peux pas sembler ajouter plus de 1 si je mets à des .Timetables.Add. "impossible de convertir" System.Data.Objects.DataClasses.EntityCollection "en" BookingSystem.Data.Models.Timetable "" –

+0

Add() prend un objet de base, pas une collection. Parcourez la collection source avec foreach et ajoutez() chaque objet à la collection de destination. –

2
foreach(var time in schedule.Timetables){ 
    s.Timetables.Add(time) 
} 

Vous pouvez boucler sur les tables de temps en schedule.Timetables et les ajouter à votre nouvelle entité.

+0

malheureusement je reçois une erreur (suédois), quelque chose à propos de la valeur a été modifié et il ne peut pas en boucle à travers eux –

+0

Avez-vous une InvalidOperationException dans foreach parce que la collection source a été modifiée? Si oui, assurez-vous que vous n'essayez pas d'ajouter des éléments de schedule.Timetables à lui-même (par opposition à les ajouter à s.Timetables) –

+0

mis à jour mon poste. Et j'ai cette exception. Je ne suis pas sûr de savoir pourquoi, c'est l'objet nouvellement créé que je veux sauvegarder dans la base de données, donc –

1

Une autre option serait:

((List<TimeTable>)s.Timetables).AddRange(((List<TimeTable>)schedule.Timetables)); 
+0

Si la réponse de Dan n'a pas fonctionné, le mien non plus. –

+0

Ils devraient tous deux travailler. –

1

Regardez les premières lignes:

Schedule s = _entities.Schedules.Where(x => x.ScheduleID == schedule.ScheduleID && x.BookingObject.BookingObjectID == bookingObjectID).FirstOrDefault(); 

if(s == null) 
    s = new Schedule(); 

Sur la première ligne, vous interrogez la base de données pour un objet avec le même ScheduleId que schedule et stocker la référence renvoyée dans s. En supposant que cet objet est disponible dans la base de données, vous pointez effectivement s sur le même objet que schedule. Cela signifie que s.Timetables et schedule.Timetables sont la même collection, ce qui provoquera l'exception que vous obtenez pendant la foreach.

Je suppose que vous voulez seulement cloner l'objet pointé par la planification et l'insérer dans la base de données si ce n'est pas déjà dans la base de données. Dans ce cas:

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(); 
} 
+0

changé mais j'ai toujours la même exception. –

+0

lorsque vous déboguez et franchissez, voyez-vous quelque chose d'informatif qui se passe? –

Questions connexes