Лучший способ обновить модель LINQ из формы - PullRequest
2 голосов
/ 27 февраля 2009

Я проектирую формы в своем приложении 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 имеет свойство NationalityID, которое обнуляется, если оно не отображается в форме редактирования.

Как лучше всего обновлять модель, используя только поля из формы? Нужно ли сначала получать запись из базы данных и обновлять ее свойства, например:

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

Или есть какой-нибудь другой, более чистый способ сделать это?

Ответы [ 2 ]

2 голосов
/ 27 февраля 2009

Стивен Уолтер только что опубликовал статью, описывающую эту самую вещь в ASP.NET MVC. Я бы порекомендовал вам создать собственный набор DTO и бизнес-объектов поверх LINQ to SQL и рассматривать LINQ to SQL как интегрированную в язык базу данных объектов из-за грубых сложностей , возникающих при управлении DataContext , который, согласно Pro LINQ , должен быть как можно меньше поддержан живым.

Если вы собираетесь использовать объекты LINQ to SQL в качестве DTO, вы должны сначала получить объект, отсоединить его, обновить, повторно присоединить, а затем отправить.

1 голос
/ 27 февраля 2009

В вашем контроллере извлеките существующего человека из хранилища, затем используйте 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);

      ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...