Возврат сущности EF с дочерними объектами в виде JSON из MVC Action - PullRequest
0 голосов
/ 26 марта 2011

У меня есть приложение MVC 3, использующее EF. При входе в систему я аутентифицирую пользователя с помощью ajax и хочу вернуть список вещей, которые мне нужно выбрать. У меня есть ViewModelLogin, который имеет IEnumerable. Я использую AutoMapper, чтобы заполнить ViewModel от объекта EF, а затем вернуть ViewModel как JSON.

[HttpPost]
    public ActionResult Login(ViewModelLogin login)
    {
        Mapper.CreateMap<ViewModelLogin, User>()
            .ForMember(dest => dest.Email, opt => opt.MapFrom(src => src.Email))
            .ForMember(dest => dest.Password, opt => opt.MapFrom(src => src.Password));

        var user = _userService.GetUser(Mapper.Map<ViewModelLogin, User>(login));

        if (user != null && CreatePasswordHash(login.Password, user.Salt) == user.Password)
        { 
            var ticket = new FormsAuthenticationTicket(1, login.Email, DateTime.Now, DateTime.Now.AddMinutes(20), false, "");
            var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(ticket));
            Response.Cookies.Add(cookie);

            Mapper.CreateMap<User, ViewModelLogin>()
                .ForMember(dest => dest.Things, opt => opt.MapFrom(src => src.Things))
                .ForMember(dest => dest.Password, opt => opt.Ignore());
            var returnLogin = Mapper.Map<User, ViewModelLogin>(user);
            returnLogin.Success = true;

            return Json(returnLogin);
        }
        return Json(new ViewModelLogin { Success = false, Message = "Test Message"});
    }

Когда я делаю это, я получаю сообщение об ошибке, когда сериализатор пытается преобразовать сущность в JSON. Проблема заключается в циклической зависимости, потому что коллекция сохраняет информацию об отношениях из EF (в моем случае это отношение многие ко многим), кроме того, чтобы делать это вручную, кто-нибудь еще решил эту проблему?

Спасибо

1 Ответ

0 голосов
/ 26 марта 2011

Вы должны удалить циклическую зависимость из вашей модели представления, или вы хотите иметь возможность сериализовать ее как JSON. Также не звоните Mapper.CreateMap<TSource, TDest> в вашем контроллере. Этот метод должен вызываться только один раз в идеале в Application_Start.

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