2017-02-16 17 views
0

私はContact-Controllerの "Repository-Pattern"と "Edit"メソッドを実装しようとしていますContact-Repositoryで「Attach Method」を使用すると、Errorがスローされます。タイプ 'DBContext.Models.Contact'のオブジェクトを型 'System.Data.Entity.Infrastructure.IObjectContextAdapter'にキャストできません

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

この問題は、私はコード内のエラーを発見していないObjectStateManger拡張の別の問題に直面する前に:だから私は別のスタックから問題の解決策として、新たな変数「マネージャー」を使用していた

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

を (ObjectStateManager no definition issue)フロースレッド上には、Cを利用した接触コントローラで接触リポジトリ

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

     } 

編集メソッドのメソッドを添付しますで

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

答えて

2

ontactRespository answerあなたは答えがこれを持って、参照した:

その質問でOPが IObjectContextAdapter実装する型を持っているので、作品
var manager = ((IObjectContextAdapter)db).ObjectContext.ObjectStateManager; 
             ^^ 
             || 
            see this is db 

。その問題のOPは、この持って:あなたはこれをやろうとしている

SampleContext db = new SampleContext(); 

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

あなたentityあなたはIObjectContextAdapterにキャストすることはできませんし、それが正確に何のエラーであるので、そのインターフェイスを実装していません。メッセージがあなたに伝えています。

+0

私は、この行とその働きでEntire Attach Codeを置き換えました。 'entities.Entry(エンティティ).State = EntityState.Modified;'私は '民間CTEntities実体=新しいCTEntities()持っていても私のコードで ;' と私は置き換えを 'VARマネージャ=((IObjectContextAdapter)エンティティ).ObjectContext.ObjectStateManager; ' エンティティを、私のDBContextのインスタンスであった" Entities "と置き換えました。どうもありがとうございました! – Arun3x3

関連する問題