更新来自表单的LINQ模型的最佳方法

时间:2009-02-27 17:40:00

标签: c# asp.net-mvc linq

我正在我的ASP.NET MVC应用程序中设计将接收对象的表单。以下是典型的编辑操作:

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Edit(int id, Person person)
    {
        peopleService.SavePerson(person);
        return Redirect("~/People/Index");
    }

服务中的SavePerson调用会执行此操作:

    public void SavePerson(Person person)
    {
        _peopleRepository.SavePerson(person);
    }

存储库中的SavePerson调用执行此操作:

    public void SavePerson(Person person)
    {
        using (var dc = new SIGAPDataContext())
        {
            if (person.IsNew)
            {
                dc.People.InsertOnSubmit(person);
            }
            else
            {
                dc.People.Attach(person, true);
            }

            dc.SubmitChanges();
        }
    }

现在,当我创建新记录时,这很有效。但是,当我在没有所有表单元素的情况下更新它时,它会使其他字段为空。例如,我的Person模型有一个EthnicID属性,如果它没有显示在编辑表单上,则该属性为空。

使用来自表单的字段进行模型更新的最佳做法是什么?我是否必须先从数据库中获取记录并手动更新其属性,如:

Person persistedPerson = peopleService.GetPerson(person.ID);
persistedPerson.Name = person.Name;
persistedPerson.DateOfBirth = person.DateOfBirth
// etc...

或者还有其他更清洁的方法吗?

2 个答案:

答案 0 :(得分:2)

Stephen Walther刚刚在ASP.NET MVC中发布了an article describing this very thing。我建议您实际在LINQ to SQL之上创建自己的DTO和业务对象集,并根据language-integrated object databasegross complexities introduced by managing the DataContext处理为Pro LINQ的LINQ to SQL,应尽可能少地通过设计保持活着。

如果您打算将LI​​NQ to SQL实体用作DTO,则应先获取实体,分离,更新,重新附加,然后提交。

答案 1 :(得分:1)

在您的控制器中,从存储库中检索现有人员,然后使用UpdateModel / TryUpdateModel并传入要更新的属性列表。这将使用控制器上的ValueProvider,因此不需要在操作参数列表中使用Person对象。

public ActionResult Edit( int id )
{
      Person person = peopleService.GetPerson(id);
      UpdateModel(person,new string[] { list of properties to update } );
      peopleService.SavePerson(person);

      ...
}