2012-05-01 16 views
2

このような質問を少なくとも1ダースも読んだことがありますが、このようなものをいくつか把握するのには苦労しています。IEntityChangeTrackerエラーの複数のインスタンスのエラー

私は、エンティティフレームワークにリンクするリポジトリとコードファーストエンティティでASP.NET MVC3を開発することに慣れています。

私は最近、サービス開発でデータベース初のADO.NETに切り替えました。 私は外来キーを介して物にアクセスできるので、これは非常にきれいであることがわかります。

とにかく、私の古い保存の方法は、私は常にこのエラー

は、エンティティオブジェクトが IEntityChangeTracker

の複数のインスタンスによって参照することはできませんので、ここで私を見てはいますので、壊れているように見えますアクションと私のサービスを保存します。

処置:

[HttpPost] 
     public ActionResult AddReview(Review review, int id) 
     { 
      User loggedInUser = userService.GetUserByusername(User.Identity.Name); 
      review.WriterId = loggedInUser.UserId; 
      review.ProductId = id; 

      if (ModelState.IsValid) 
      { 
       reviewService.Save(review); 
       Product product = productService.GetProduct(id); 

       if(product.Quantity>=1) 
        product.Quantity--; 
       product.TimesBought++; 

       productService.UpdateRating(product, reviewService); 

       loggedInUser.GoldCoins -= product.Price; 
       Session["goldCoins"] = loggedInUser.GoldCoins; 
       userService.Save(loggedInUser); 
       productService.Save(product); 

      } 
      else 
      { 
       return View(review); 
      } 
      return RedirectToAction("Index", "Answers", new { reviewId = review.ReviewId }); 

サービス:(var db = new CapstoneEntities())を使用しますが、私はこれを行うにはどのように他わからない:

public class ReviewService : Service<Review, CapstoneEntities> 
    { 

     ... 

     public void Save(Review review) 
     { 


     using (var db = new CapstoneEntities()) 
     { 
      if (review.ReviewId == 0) 
      { 
       db.Reviews.Add(review); 
       db.Entry(review).State = EntityState.Added; 
      } 
      else 
      { 
       db.Entry(review).State = EntityState.Modified; 
      } 
      db.SaveChanges(); 
     } 
    } 
} 

私の疑惑は、このコード行です。繰り返しますが、これは以前のやり方ではうまくいきましたが、今ではCRUD操作について間違いがあります。

ありがとうございます。

答えて

2

これは、エンティティが複数のDataContextに属しているために発生しているようです。そのアクションを呼び出すコードは、データストアに永続化するのに使用されたエンティティと同じDataContextを使用してエンティティを作成する必要があります。

ほとんどの場合、DataContextのインスタンスを1つだけ保持する必要があります。 CastleのようなDIフレームワークを使用して、依存関係(この場合はDataContext)をTransientまたはPerWebRequestとして定義/格納し、サービスとコントローラに注入することができます。そのため、常にDataContextの同じインスタンスへの参照があります。

+0

アクションはフォームによって呼び出されていますが、これは私が知っている限り、DataContextについての知識はありません。 – Johannes

+0

'Review'はエンティティ、モデル、あるいはその両方ですか?それがモデルの場合は、DataContextを使用してそれを取得していますか? – lukiffer

+0

エンティティはモデルのようなものですね。しかし、それらはADO.NETによってModels.ttファイルに自動生成されました。 – Johannes

4

私はMVCを初めて利用しました&エンティティフレームワーク。私は多くの戦いの後に同じ問題を抱えています このソリューションは私のために働いた。それはあなたのために役立つことを願っています。

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

あなたがDBからオブジェクト全体を読んで、あなたはその、すでに現在のコンテキストに取り付けられた1つのエンティティを説明しますエンティティの状態を変更しようとすると、現在のコンテキストでそれを保持している原因。変更を保存するだけで保存します。

関連する問題