ASP.NET MVC2 Отправка сопоставления ViewModel в домен (LINQ) для отправки изменений

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

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

Сущность Linq, которую я использую, имеет несколько коллекций других сущностей (т. Е. Ссылок "один ко многим").

Я пытался:

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

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

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


person Chris    schedule 27.07.2010    source источник


Ответы (1)


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

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

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

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

Вот как выглядит один из моих картографов для участника:

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

person Jeff Treuting    schedule 28.07.2010
comment
Спасибо, я внимательно посмотрел на codecampserver.codeplex.com, там много чего можно узнать. Я пошел с чем-то похожим на то, что вы предложили, спасибо, что указали мне в правильном направлении. - person Chris; 30.07.2010