C# 实体框架保存本机类型属性,但不保存嵌套对象

C# 实体框架保存本机类型属性,但不保存嵌套对象,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,我将viewmodel发布到我的控制器,并将其自动映射到entity对象,然后使用entry()方法将其持久化,根据它是要添加还是更新来更改其状态。在我自动映射对象之后,我确保对象不是空的,也许我坚持它是错误的。我的问题是,中的嵌套对象不会持久化更改 public ActionResult saveUpdatePessoa(PessoaViewModel id) { if (ModelState.IsValid) { var pe

我将viewmodel发布到我的控制器,并将其自动映射到entity对象,然后使用entry()方法将其持久化,根据它是要添加还是更新来更改其状态。在我自动映射对象之后,我确保对象不是空的,也许我坚持它是错误的。我的问题是,中的嵌套对象不会持久化更改

public ActionResult saveUpdatePessoa(PessoaViewModel id)
    {

        if (ModelState.IsValid)
        {
            var pes = MvcApplication.Mapper.Map<PessoaViewModel, Pessoa>(id);
            using (var db = new CityManagerDbCtx())
            {                   

                db.Entry(pes).State = pes.codigo == 0 ? EntityState.Added : EntityState.Modified;
                //db.Entry(pes.endereco).State = pes.endereco.codigo == 0 ? EntityState.Added : EntityState.Modified;//Gives me error here if I uncomment this line

                db.SaveChanges();

                string smsg = id.codigo > 0 ? "Pessoa editada com sucesso." : "Pessoa salva com sucesso.";
                ModelState.Clear();
                return Json(new SubmitFormViewModel
                {
                    success = true,
                    form = RenderHelper.PartialView(this, PESSOA_FORM_VIEW, new PessoaViewModel { dt_cad = DateTime.Now.Date, dt_nasc = DateTime.Now.Date }),
                    successMessages = new string[] { smsg },
                    errorMessages = new string[] { }
                });
            }                              
        }

        return Json(new SubmitFormViewModel
        {
            success = false,
            form = RenderHelper.PartialView(this, PESSOA_FORM_VIEW, id),
            successMessages = new string[] { },
            errorMessages = ModelState.Values.SelectMany(m => m.Errors).Select(e => e.ErrorMessage).ToArray()
        });
    }
public ActionResult saveUpdatePessoa(PessoaViewModel id)
{
if(ModelState.IsValid)
{
var pes=mvcapapplication.Mapper.Map(id);
使用(var db=new CityManagerDbCtx())
{                   
db.Entry(pes).State=pes.codigo==0?EntityState.添加:EntityState.Modified;
//db.Entry(pes.endereco.State=pes.endereco.codigo==0?EntityState.Added:EntityState.Modified;//如果我取消注释此行,会在此处出错
db.SaveChanges();
字符串smsg=id.codigo>0?“Pessoa editada com successo.”:“Pessoa salva com successo.”;
ModelState.Clear();
返回Json(新SubmitFormViewModel
{
成功=正确,
form=RenderHelper.PartialView(这个,PESSOA_form_视图,新的PessoaViewModel{dt_cad=DateTime.Now.Date,dt_nasc=DateTime.Now.Date}),
successMessages=新字符串[]{smsg},
errorMessages=新字符串[]{}
});
}                              
}
返回Json(新SubmitFormViewModel
{
成功=错误,
form=RenderHelper.PartialView(这个,PESSOA\u form\u视图,id),
successMessages=新字符串[]{},
errorMessages=ModelState.Values.SelectMany(m=>m.Errors)。Select(e=>e.ErrorMessage)。ToArray()
});
}

如果这些“嵌套对象”是类,则需要像“Pessoa”类一样显式更新它们。它不会因为包装器类被更新就隐式地知道如何更新这些嵌套类


但是,添加带有嵌套对象的类将添加所有内容。只是更新不同。

可能会上载PessoaViewModel和Pessoa模型,以便我们可以看到嵌套对象。如果您已经更新了这些嵌套对象(没有引用另一个,实际上更改了嵌套对象的值),您将需要显式地更新它们,就像您在“Pessoa”类中所做的那样。它不会因为包装器类被更新就隐式地知道更新这些嵌套类。它们是类!你的意思是,当我想要更新它时,我必须为类中合成的每个对象执行entry()方法,将它的状态设置为modified?很遗憾,这里有一个相关的问题试图做你发送给我的示例,但我得到和invalidoOperationException说:“属性'codigo'是对象密钥信息的一部分,无法修改。”此行出现异常:db.Entry(dbFoo.endereco).CurrentValues.SetValues(pes.endereco);对于嵌套对象,您的id当前是否为空?如果在更新之前将嵌套类的“id”值设置为它们的db值是否有帮助?如果我硬编码包含这些对象,并确保传递给setValues的entry object key和object key相同,它会起作用!我觉得有点失望,因为我认为它会自动更新相关的对象。但是非常感谢@Norman Bentrley。我是asp.net的新手,我有很多异常。