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

Product您必须分别处理更新和之间的关系Brand。手动将状态设置为 不会影响该关系Modified。首先从数据库中加载(连同产品)尤为重要Brand,否则 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如果您在Product实体中引入外键属性并将其设置product.BrandId在视图中而不是product.Brand.Id. 在这种情况下,将状态设置为Modified会起作用,因为BrandId它是一个标量属性。

于 2012-04-10T19:04:32.097 回答