如何在EF中正确地更新模型实体实例

本文关键字:更新 模型 实体 实例 正确地 EF | 更新日期: 2023-09-27 17:50:23

我有一些代码如下。这工作,但我认为这是不够清楚,需要我写冗长的代码(手动分配每个属性)。

// POST: /TableA/Edit
[HttpPost]
public ActionResult Edit(TableA formdata)
{
    TableA temp = myDB.TableA.First(a=>a.Id == formdata.Id);
    //A foreign key model in another TableB
    var tbb = myDB.TableB.First(a => a.Id == formdata.TableB.Id);
    temp.TableB = tbb;
    //fields in this table
    temp.field1= formdata.field1;
    temp.field2= formdata.field2;
    temp.field3= formdata.field3;
    myDB.SaveChanges();
    return RedirectToAction("Index");
}

我能有一些类似于对象初始化器的代码吗?

    TableA temp = myDB.TableA.First(a=>a.Id == formdata.Id)
    {
        TableB =  myDB.TableB.First(a => a.Id == formdata.TableB.Id),
        field1= formdata.field1,
        field2= formdata.field2,
        field3= formdata.field3,
    }
    myDB.SaveChanges();
    return RedirectToAction("Index");

如何在EF中正确地更新模型实体实例

使用AutoMapper,你可以这样写(可能必须设置限制对象之间的映射到你想要复制的属性):

[HttpPost]
public ActionResult Edit(TableA formdata)
{
    TableA temp = myDB.TableA.First(a=>a.Id == formdata.Id);
    temp.TableB = myDB.TableB.First(a => a.Id == formdata.TableB.Id);
    AutoMapper.Mapper.Map(formdata, temp);
    myDB.SaveChanges();
    return RedirectToAction("Index");
}

您可以使用TryUpdateModel方法

使用来自控制器的当前值提供程序和包含的属性的值更新指定的模型实例。

[HttpPost]
public ActionResult Edit(TableA formdata)
{
    if (ModelState.IsValid)
    {
        TableA temp = myDB.TableA.First(a=>a.Id == formdata.Id);
        if (TryUpdateModel<TableA>(temp))
        {
            myDB.SaveChanges();
            return RedirectToAction("Index");
        }
    }
    return View();
}

你最好调用Controller。TryUpdateModel方法(TModel, String[])防止你不想编辑的属性在发布之前被添加到表单中。这包括ID或其他您不希望表单发布的字段。

相关文章: