我有一个与类相关的集合,但我无法将它们保存到数据库中。其他成员保存成功但收集不成功。
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没有保存在数据库中。
有人有想法吗?
答案 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即可获得其类别