12

G'day All、Apress Pro Asp.net MVC Framework 3のALPHAを購入して、SportsStoreを作成した人はいますか?製品を編集してDBを正常に更新することはできませんか?エラーは表示されず、すべての機能の単体テストが行​​われますが、「編集」が成功しません。つまり、詳細を変更して[保存]をクリックすると、成功したと報告されます。結果を確認しても何も起こりませんか?SportsStoreで作業しているときに、他の誰かがこれを見つけましたか?アドバイスをいただければ幸いです。

乾杯。

4

7 に答える 7

12

EF オブジェクトの状態は、保存する前に更新する必要があります。

public void SaveProduct(Product product)
        {
            if (product.ProductID == 0)
            {
                context.Products.Add(product);
            }
            else
            {
                context.Entry(product).State = System.Data.EntityState.Modified;
            }


            int result = context.SaveChanges();

        }
于 2011-09-08T18:19:00.743 に答える
3

まだコメントを投稿することはできませんが、最終的なメソッドが何を読むべきかを示すことで、MVC 初心者のコメントに追加したいと思います。

public void SaveProduct(Product product) {
    if (product.ProductID == 0) {
        context.Products.Add(product);
    } else {
        context.Entry(product).State = EntityState.Modified;
    }
    int numSaved = context.SaveChanges();
}

また、追加の using ステートメントを追加することも忘れないでください (MVC 初心者が言及したように):

//using system.data;
于 2011-09-15T07:56:53.493 に答える
1

以下をお試しください。アイデアは、MVC モデルが Action メソッドにバインドされているという製品パラメーターが EF と同期していないため、それをリポジトリに関連付ける必要があるということです。

public ActionResult Edit(Product product)   
{
    if (ModelState.IsValid)
    {
        ((ObjectSet<Product>)repository.Products).ApplyCurrentValues(product);

        repository.SaveProduct(product);
        TempData["message"] = string.Format("{0} has been saved", product.Name);
        return RedirectToAction("Index");
    }
    else 
    {
        return View(product);
    }
}
于 2011-07-25T10:45:18.460 に答える
0

Apress Pro ASP.NET MVC3 の最終バージョンを使用して同じ問題に遭遇しました。Visual Studio デバッガーを使用して、context.SaveChanges()(SportsStore.Domain.Concrete.EFProductRepostory) が実行されたときに、コンテキストが編集ビュー内で行った変更に変更されていないことに気付きました。SaveProduct() のコンストラクターで定義された製品ですが、

したがって、次のように Context.Products.Product をコンストラクター内の製品に変更するだけでよいと思います。

        else
        {
            context.Products.Find(product.ProductId) = product;
        }

残念ながら、Visual Studio で次のエラーが発生しました。

エラー 1 代入の左側は、変数、プロパティ、またはインデクサーでなければなりません

だからそれを機能させるために、私はこれをしなければなりませんでした:

        else
        {
            context.Products.Find(product.ProductID).Name = product.Name;
            context.Products.Find(product.ProductID).Description = product.Description;
            context.Products.Find(product.ProductID).Category = product.Category;
            context.Products.Find(product.ProductID).Price = product.Price;
        }

これは機能します。しかし、これは理想とはかけ離れており、最善の方法ではないと思います。

すべてのプロパティを 1 つずつ編集するのではなく、コンテキスト内の Product オブジェクト全体を編集/更新する方法でこれを行う方法はありますか?

于 2011-08-15T16:38:22.317 に答える
0
public void SaveProduct(Product product)
{
    var prod = context.Products.SingleOrDefault(p => p.ProductID == product.ProductID);
    if (product.ProductID > 0)  
    {
        context.Products.Remove(prod);
    }
    context.Products.Add(product);            
    context.SaveChanges();
}
于 2011-11-19T18:33:10.567 に答える
-1

これが答えです

public void SaveProduct(Product product)
    {
        var prod = context.Products.SingleOrDefault(p => p.ProductID == product.ProductID);

        if (product.ProductID > 0)
        {
            context.Products.Remove(prod);
        }
            context.Products.Add(product);            
            context.SaveChanges();
    }
于 2011-11-19T18:43:12.233 に答える
-1

これを試して

 public ActionResult Edit(Product product)
    {
        if (ModelState.IsValid)
        {
            Product p = repository.Products.FirstOrDefault(x => x.ProductID == product.ProductID);
            if (p != null)
            {
                p.ProductID = product.ProductID;
                p.Price = product.Price;
                p.Category = product.Category;
                p.Description = product.Description;
                p.Name = product.Name;
            }
            else
                p = product;
            repository.SaveProduct(p);
            TempData["message"] = string.Format("{0} has been saved", product.Name);
            return RedirectToAction("Index");
        }
        else 
        {
            return View(product);
        }
    }

mvc 3の初心者ですが、モデル参照(製品パラメータ)はEF Contextにバインドされていない製品オブジェクトだと思います

于 2011-07-20T03:15:34.810 に答える