1

FreemanA.とSandersonSによる「ProASP.NetMVC3FrameworkThirdEdition」という本を読んでフォローしています。

エンティティを更新する方法を教えてくれる部分に到達しました。アップデートを除いて、すべて正常に動作します。

ストア内のアイテムを編集するためのページがあります。かなり基本的です。ページの値を変更して送信すると、新しい値を使用して、必要な方法でリポジトリの実装に到達します。

これで、この本は私のリポジトリ(SaveProduct)で次のメソッドを示しています。

namespace SportsStore.Domain.Concrete
{
    public class EFProductRepository : IProductRepository
    {
         private EFDbContext context = new EFDbContext();
    public IQueryable<Product> Products
    {
        get { return context.Products; }
    }
    public void SaveProduct(Product product)
    {
        if (product.ProductID == 0)
        {
            context.Products.Add(product);
        }
        context.SaveChanges();
    }
}
}

この方法は、製品を保存しないことを除いて機能します。私はMVC3の曖昧さを完全に理解していないので、行き詰まっています。製品は、適切な値でSaveProductメソッドのパラメーターとして到着し、保存する必要がありますが、コンテキストは更新されません。

これはMVC3で更新されたものですか?(この本は少し時代遅れですか?)すべての値を個別にチェックする場合はコード化できますが、MVC3 /EntityFrameworkの能力が失われていると感じずにはいられません。

誰か助けてもらえますか?どうもありがとう!:)その間、私はデバッグして手がかりを探します!

編集:

SaveChanges()が返す整数をキャッチすると、ゼロのように見えます。したがって、新しい値を持つエンティティは、エンティティフレームワークに「更新」されていないと思います。

編集2:

私は(すでに)問題を見つけました。質問が速すぎたようですが、お詫び申し上げます。これが私がしたことです:

SaveProductメソッドに次のコードを追加しました。

    public void SaveProduct(Product product)
    {
        if (product.ProductID == 0)
        {
            context.Products.Add(product);
        }
        else
        {
            var productInDb = context.Products.FirstOrDefault(x => x.ProductID == product.ProductID);
            context.Entry(productInDb).CurrentValues.SetValues(product);
        }
        context.SaveChanges();
    }

私はこれがそうするための1つの適切な方法だと思いますか?役に立たない質問でごめんなさい:)

4

1 に答える 1

2

問題は、エンティティがあなたによって追跡されていないことです。EFDbContextそのため、あなたが呼び出すときcontext.SaveChanges();、それはそれを更新する必要があることを知りません。

したがって、コンテキストがエンティティのステータスを追跡することを認識していることを確認する必要があります。

これを行うには、基本的に2つの方法があります。2番目の編集でリストする方法、またはエンティティをコンテキストに手動で「アタッチ」して、以下のように変更済みとしてマークする方法です。

context.Products.Attach(product);
context.Entry(product).State = EntityState.Modified;
于 2012-07-23T05:02:54.253 に答える