2017-02-16 1 views
0

J'essaie d'implémenter la méthode "Repository-Pattern" et "Edit" dans Contact-Controller l'utilisation de "Attach Méthode" dans Contact-Repository est Erreur de lancement.Impossible de convertir l'objet de type 'DBContext.Models.Contact' en type 'System.Data.Entity.Infrastructure.IObjectContextAdapter'

Additional information: Unable to cast object of type 'Contacts.Models.Contact' to type 'System.Data.Entity.Infrastructure.IObjectContextAdapter'. 

Avant cette question, je fait face à un autre problème de ObjectStateManger Extension non trouvée erreur dans le code:

entities.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified); 

donc je devais utiliser une nouvelle variable « gestionnaire » comme une solution pour la question d'une autre pile sur fil d'écoulement (ObjectStateManager no definition issue) Fixer Méthode en contact de dépôt

public void Attach(Contact entity) 
     { 
      if (entity == null) 
       throw new ArgumentNullException("entity"); 

      var manager = ((IObjectContextAdapter)entity).ObjectContext.ObjectStateManager; 

      entities.Contacts.Attach(entity); 

      manager.ChangeObjectState(entity, EntityState.Modified); 

     } 

Modifier la méthode en contact contrôleur qui fait usage de C ontactRespository

public ActionResult Edit(int?id) 
      { 
       Contact contact = repo.Get(c => c.ID == id); 
       if (contact == null) 
       { 
        return HttpNotFound(); 
       } 
       return View(contact); 
      } 


      // 
      // POST: /Contacts/Edit/5 

      [HttpPost] 
      public ActionResult Edit(Contact contact) 
      { 
       if (ModelState.IsValid) 
       { 
        repo.Attach(contact); 
        repo.SaveChanges(); 
        return RedirectToAction("Index"); 
       } 
       return View(contact); 
      } 

Répondre

2

Dans le answer vous avez fait référence, la réponse a ceci:

var manager = ((IObjectContextAdapter)db).ObjectContext.ObjectStateManager; 
             ^^ 
             || 
            see this is db 

Cela fonctionne parce que l'OP dans cette question a un type qui met en œuvre le IObjectContextAdapter. L'OP dans cette question a ceci:

SampleContext db = new SampleContext(); 

Vous essayez de le faire:

var manager = ((IObjectContextAdapter)entity).ObjectContext.ObjectStateManager; 

Votre entity ne met pas en œuvre cette interface afin que vous ne pouvez pas le jeter aux IObjectContextAdapter et qui est exactement ce que l'erreur le message vous dit.

+0

I Remplacement du code joint entier par cette ligne et son fonctionnement. 'entities.Entry (entité) .State = EntityState.Modified;' Même dans mon code que j'ai entités 'de CTEntities privées = new CTEntities();' Et je gestionnaire 'a remplacé var = ((IObjectContextAdapter) entités) .ObjectContext.ObjectStateManager; ' J'ai remplacé l'entité par" Entities "qui était l'instance de mon DBContext et son fonctionnement correct. Merci beaucoup! – Arun3x3