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没有保存在数据库中。
有人有主意吗?
由于您正在从断开连接的对象更新实体,因此更改跟踪器将无法工作,对非标量属性的更改也将无法工作。
如果你真的喜欢这样,它应该会起作用。
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,就可以获得其类别