0

私は製品クラスを持っています:

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Amount { get; set; }

    public virtual Brand Brand { get; set; }
}

私はこれを行うモデルを更新しようとしています:

[HttpPost]
public ActionResult Edit(Product product) 
{
    if (ModelState.IsValid) 
    {
        product.Brand = db.Brands.Find(product.Brand.Id);

        db.Entry(product).State = EntityState.Modified;
        db.SaveChanges();

        return RedirectToAction("Index");
    }
    return View(product);
}

問題は、すべてのプロパティが更新されていることですが、ブランド !! 更新するにはどうすればよいですか?


私が行った場合:

[HttpPost]
public ActionResult Edit(Product product) 
{
     if (ModelState.IsValid)  
     {
          db.Products.Attach(product);

          product.Brand = db
              .Brands
              .Find(2); // << with a static value

          db.Entry(product).State = EntityState.Modified;

          db.SaveChanges();

          return RedirectToAction("Index");
      }
      return View(product);
 }

それは機能します...しかし、BrandIdが2であっても、以下でこれを試してみると機能しません:

    [HttpPost]
    public ActionResult Edit(Product product) 
    {
        if (ModelState.IsValid)  
        {
            db.Products.Attach(product);

            int BrandId = product.Brand.Id;

            product.Brand = db
                .Brands
                .Find(BrandId);

            db.Entry(product).State = EntityState.Modified;

            db.SaveChanges();

            return RedirectToAction("Index");
        }
        return View(product);
    }
4

1 に答える 1

1

と の関係の更新はProductBrand個別に処理する必要があります。状態を手動で に設定しても、関係は影響を受けませんModifiedBrand最初に DB から (製品と一緒に)をロードすることが特に重要です。そうしないと、EF は関係が変更されたかどうかを検出できません。

[HttpPost]
public ActionResult Edit(Product product) 
{
    if (ModelState.IsValid) 
    {
        var productInDB = db.Products.Include(p => p.Brand)
            .Single(p => p.Id == product.Id);

        // Update scalar properties
        db.Entry(productInDB).CurrentValues.SetValues(product);

        // Update relationship between product and brand
        if (product.Brand == null && productInDB.Brand != null)
            productInDB.Brand = null;
        else if (product.Brand != null && (productInDB.Brand == null
            || product.Brand.Id != productInDB.Brand.Id))
        {
            db.Brands.Attach(product.Brand);
            productInDB.Brand = product.Brand;
        }

        db.SaveChanges();

        return RedirectToAction("Index");
    }
    return View(product);
}

エンティティに外部キー プロパティを導入し、これを の代わりにビューに設定するとBrandId、この手順がはるかに簡単になります。この場合、 はスカラー プロパティであるため、状態を に設定すると機能します。Productproduct.BrandIdproduct.Brand.IdModifiedBrandId

于 2012-04-10T19:04:32.097 に答える