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

C# MVC编辑操作不保存相关数据,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,我有一个与类相关的集合,但无法将它们保存到数据库中。其他成员已成功保存,但集合未保存 public ActionResult Edit([Bind(Include = "ProductTypeId,Name,IsActive")] ProductType productType, string[] chkAttributeCategory) { productType.AttributeCategories.Clear(); if (chkAtt

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

    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);
    }
我的视图上有一个复选框列表,它表示子对象的列表。我在Debugger中的SaveChanges行之前检查了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();
var productTypeDb=db.Set()
.Include(pt=>pt.AttributeCategories)
.FirstOrDefault(pt=>pt.ProductTypeId==productType.ProductTypeId)
productTypeDb.AttributeCategories.Clear();
if(chkAttributeCategory!=null)
{
foreach(chkAttributeCategory中的字符串attributeCategory)
{
productTypeDb.AttributeCategory.Add(db.AttributeCategory
.Find(int.Parse(attributeCategory));
}
}
productTypeDb.Name=productType.Name;
productTypeDb.IsActive=productType.IsActive;
//其他属性
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();
List attributes=(从db.ProductTypeCategories中的p开始,从db.Categories中的c开始,其中p.ProductTypeID==ProductTypeID&&p.CategoryID==c.ID选择c)。toList();

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

productType
不是代理,更改跟踪器将不适用于断开连接的对象,您需要首先从db获取
productType
,或者手动管理关系。是一对多还是多对多?