Erreur: "Un objet d'entité ne peut pas être référencé par plusieurs instances de IEntityChangeTracker"

ado.net-entity-data-model asp.net-mvc entity-framework linq-to-entities

Question

J'utilise actuellement le modèle de référentiel dans un projet ASP.Net MVC et j'ai le code suivant:

    partial class Timesheet : ITimesheet
        {
            TimeSystemDBEntities _db;

            public Timesheet()
            {
                _db = new TimeSystemDBEntities();
            }
            .
            .
             //More Methods
            .
            .

            //Save WorkWeek to database
            private void SaveWorkWeek(WorkWeek wk)
                {
                    //Creating a new test context in attempt to resolve
                    //Error: “An entity object cannot be referenced by multiple instances of IEntityChangeTracker"
                    var testContext = new TimeSystemDBEntities();
                    var newWorkWeek = new WorkWeek();
                    var newStudent = new Student();
                    //Copy contents of wk to newWorkWeek
                    newWorkWeek.Students = newStudent.GetStudent(wk.Students.id);
                    newWorkWeek.MonDate = wk.MonDate;
                    newWorkWeek.MonHours = wk.MonHours;
                    newWorkWeek.TuesDate = wk.TuesDate;
                    newWorkWeek.TuesHours = wk.TuesHours;
                    newWorkWeek.WedDate = wk.WedDate;
                    newWorkWeek.WedHours = wk.WedHours;
                    newWorkWeek.ThursDate = wk.ThursDate;
                    newWorkWeek.ThursHours = wk.ThursHours;
                    newWorkWeek.FriDate = wk.FriDate;
                    newWorkWeek.FriHours = wk.FriHours;
                    newWorkWeek.TempSave = wk.TempSave;

                    testContext.AddToWorkWeek(newWorkWeek); //Exception thrown here
                    testContext.SaveChanges();

                    //Also tried
                    //_db.AddToWorkWeek(newWorkWeek); //Exception thrown here
                    //_db.SaveChanges();

                    //Also tried
                    //_db.detach(wk): //Different exception thrown here: Says it's not in ObjectStateManager
                    //_db.AddToWorkWeek(newWorkWeek); 
                    //_db.SaveChanges();

                    //Also tried
                    //_db.detach(wk.Students): //Different exception thrown here: Says it's not in ObjectStateManager
                    //_db.AddToWorkWeek(newWorkWeek); 
                    //_db.SaveChanges();

                }

    }

Les classes Student et WorkWeek sont respectivement dans une relation un-à-plusieurs. J'ai tout essayé, de la dissociation à la création d'un contexte totalement nouveau, comme dans l'exemple de code ci-dessus, et je ne parviens pas à enregistrer l'objet. Lorsque j'essaie de le détacher, cela signifie en gros que ce n'est pas dans ObjectStateManager, ce que j'interprète comme s'il n'y avait rien à détacher, qui, s'il est vrai, semble contredire l'erreur initiale. Je ne suis pas sûr de ce qui se passe, toute aide est appréciée.

Réponse acceptée

@Craig, merci d'avoir déjà examiné ces liens et leurs solutions et tenté de les implémenter sans succès.

Le lien suivant m'a fourni la solution à mon problème et contient également d'autres informations très utiles sur d'autres problèmes divers liés à Entity Framework.

Le cadre de l'entité s'emballe


Réponse populaire

Je suis nouveau sur MVC & Entity Framework. J'ai eu le même problème après avoir beaucoup combattu. Cette solution a fonctionné pour moi. J'espère que cela peut vous être utile.

var mediaItem = db.MediaItems.FirstOrDefault(x => x.Id == mediaItemViewModel.Id);
    mediaItem.Name = mediaItemViewModel.Name;
    mediaItem.Description = mediaItemViewModel.Description;
    mediaItem.ModifiedDate = DateTime.Now;
    mediaItem.FileName = mediaItem.FileName;
    mediaItem.Size = KBToMBConversion(mediaItemViewModel.Size);
    mediaItem.Type = mediaItem.Type;

//db.Entry(mediaItem).State = EntityState.Modified;// coment This line
db.SaveChanges();

Parce que vous lisez l'objet entier dans la base de données et le conservez dans le contexte actuel. Lorsque vous essayez de modifier l'état de l'entité, il vous indique déjà une entité attachée au contexte actuel. il suffit d'appeler enregistrer les modifications pour le sauvegarder.



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow