从MVC Action返回带有Children作为JSON的EF实体

时间:2011-03-26 08:21:21

标签: asp.net-mvc json entity-framework-4

我有一个使用EF的MVC 3应用程序。在我的用户登录时,我使用ajax对用户进行身份验证,我想返回一些我需要他们选择的内容。我有一个IEnumerable的ViewModelLogin。我使用AutoMapper从EF实体填充ViewModel,然后将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 :(得分:0)

您应该从视图模型中删除循环依赖项,或者希望能够将其序列化为JSON。也不要在控制器中调用Mapper.CreateMap<TSource, TDest>。理想情况下,此方法只应在Application_Start中调用一次。