2

この質問と同じように、少なくとも 12 の他の質問を読みましたが、この内容のいくつかを理解するのに苦労しています。

私は、エンティティ フレームワークにリンクするリポジトリとコード ファースト エンティティを使用して 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 });

サービス:

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

私の疑いは、このコード行にあります: using(var db = new CapstoneEntities())ですが、他にこれを行う方法がわかりません。繰り返しますが、これは私の古いやり方で完全に機能しましたが、今ではほぼすべての CRUD 操作でエラーが発生します。

ありがとうございました。

4

2 に答える 2

2

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

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

于 2012-05-01T18:08:05.413 に答える
2

私は MVC と Entity フレームワークが初めてです。たくさん戦った後、同じ問題が発生しました この解決策は私にとってはうまくいきました。皆さんのお役に立てば幸いです。

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 つのエンティティがアタッチされていることがわかります。save changes を呼び出すだけで保存されます。

于 2014-12-16T11:04:51.147 に答える