MVC编辑操作不保存相关数据

本文关键字:数据 保存 编辑 操作 MVC | 更新日期: 2023-09-27 18:21:28

我有一个与类相关的集合,但我无法将它们保存到数据库中。其他成员已成功保存,但集合未保存。

    public ActionResult Edit([Bind(Include = "ProductTypeId,Name,IsActive")] ProductType productType, string[] chkAttributeCategory)
    {
        productType.AttributeCategories.Clear();
        if (chkAttributeCategory != null)
        {
            foreach (string attributeCategory in chkAttributeCategory)
            {
                productType.AttributeCategories.Add(db.AttributeCategory.Find(int.Parse(attributeCategory)));
            }
        }
        if (ModelState.IsValid)
        {
            db.Entry(productType).State = EntityState.Modified;                                
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(productType);
    }

我的视图中有一个复选框列表,它表示子对象的列表。在调试器中保存更改行之前,我已经检查了productType对象,它包含了他所需要的一切,但相关的AttributeCategories没有保存在数据库中。

有人有主意吗?

MVC编辑操作不保存相关数据

由于您正在从断开连接的对象更新实体,因此更改跟踪器将无法工作,对非标量属性的更改也将无法工作。

如果你真的喜欢这样,它应该会起作用。

var productTypeDb = db.Set<ProductType>()
    .Include(pt => pt.AttributeCategories)
    .FirstOrDefault(pt => pt.ProductTypeId == productType.ProductTypeId)
productTypeDb.AttributeCategories.Clear();
if (chkAttributeCategory != null)
{
    foreach (string attributeCategory in chkAttributeCategory)
    {
        productTypeDb.AttributeCategories.Add(db.AttributeCategory
            .Find(int.Parse(attributeCategory)));
    }
}
productTypeDb.Name = productType.Name;
productTypeDb.IsActive = productType.IsActive;
// other properties
db.SaveChanges();

还有另一种方法可以手动管理状态,以便能够处理断开连接的对象,但如果这不是强制性的,您可以像上面的代码一样操作。

我认为你不能在一个不是视图模型的模型中有一个列表或数组,我认为你需要有一个单独的模型,每个产品类型都链接到属性:

//model1
public class ProductTypeCategory{
public int ProductTypeID {get; set;}
public int CategoryID {get; set;}
}
//model2
public class Category{
public int ID {get; set;}
public string Name {get; set;}
}

现在你可以通过这种方式获得属性:

List<Category> attributes = (from p in db.ProductTypeCategories from c in db.Categories where p.ProductTypeID == productTypeID && p.CategoryID == c.ID select c).toList();

只需在上面的LINQ调用中输入产品类型的id,就可以获得其类别