ASP.NET MVC2 Отправка сопоставления ViewModel в домен (LINQ) для отправки изменений - PullRequest
1 голос
/ 27 июля 2010

Я использую AutoMapper для сопоставления между объектом Linq Domain и ViewModel, чтобы отобразить форму редактирования для пользователя, которая отлично работает.

Когда они нажимают кнопку отправки, я хотел бы знать лучший способсопоставьте ViewModel обратно с сущностью Linq и сохраните ее в базе данных.

Используемая мной сущность Linq имеет несколько коллекций других сущностей (то есть ссылок «один ко многим»).

Я пытался:

  1. создать свою пользовательскую модель представления, используя UpdateModel
  2. получить предыдущее состояние сущности Linq, используя переданный в id
  3. сопоставление модели представления с сущностью Linq (с использованием автоматического преобразователя)
  4. вызов SubmitChanges () в контексте данных

Этот метод работает, когда я 'Я только обновляю свойства, которые не являются коллекциями, но выдает ошибки при попытке изменить свойства, которые являются коллекциями.

Любая помощь / мысли будет принята с благодарностью:)

1 Ответ

1 голос
/ 28 июля 2010

Я выбрал подход, очень похожий на тот, который использовал Джимми Богард в проекте CodeCampServer (http://codecampserver.codeplex.com/)

У меня есть общий класс Mapper, который я наследую, и мне просто нужно переопределитьМетод MapToModel, который отображается из ViewModel в модель домена, и метод GetIdFromViewModel, который возвращает правильный идентификатор из модели ViewModel, чтобы слой службы мог получить модель домена из базы данных.

Мне пришлось немного изменитьиз примеров CodeCampServer, потому что некоторые из моих Моделей использовали Guid, а некоторые использовали int в качестве Id для Модели.

Вы должны быть в состоянии получить код по ссылке codeplex выше, и это должно помочь вам в этом.direction.

Вот как выглядит один из моих Mappers для члена:

public class MemberMapper : AutoFormMapper<Member, MemberFormViewModel, Guid>, IMemberMapper
{
    public MemberMapper(IMemberService service) : base(service) { }

    protected override Guid GetIdFromViewModel(MemberFormViewModel viewModel)
    {
        return viewModel.MemberId;
    }

    protected override void MapToModel(MemberFormViewModel viewModel, Member model)
    {
        // if the need arises, we will need to map the full objects as Foreign Key properties
        //  by using the proper repositories
        //  right now for loading the object to save back to the DB we don't have that need, so let's not waste the call

        model.MemberId = viewModel.MemberId;
        model.FirstName = viewModel.FirstName;
        model.LastName = viewModel.LastName;
        model.Title = viewModel.Title;
        model.EmailAddress = viewModel.EmailAddress;
        model.DirectPhone = viewModel.DirectPhone;
        model.MobilePhone = viewModel.MobilePhone;
        model.ElectronicId = viewModel.ElectronicId;
        model.ProjectRoleTypeId = viewModel.ProjectRoleTypeId;
        model.DepartmentId = viewModel.DepartmentId;
    }
}

Затем вы можете использовать этот MemberMapper для сопоставления обоих направлений. Он использует AutoMapper для перехода из модели домена.в модель представления, а затем использует метод MapToModel, который вы реализуете для сопоставления из модели представлениявернуться к модели домена.

...