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

时间:2014-09-11 12:54:38

标签: c# asp.net-mvc entity-framework

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

    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);
    }

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

有人有想法吗?

2 个答案:

答案 0 :(得分:1)

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

如果你喜欢这样,它应该有用。

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();

还有另一种方法可以手动管理状态以便能够使用断开连接的对象,但如果这不是必需的,则可以像上面的代码一样。

答案 1 :(得分:0)

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

//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即可获得其类别