AutoMapper在简单映射的情况下为所有值返回null

时间:2015-04-09 15:02:44

标签: entity-framework automapper identity dto

我正在使用带有MVC和Web API的Entity Framework 6,我一直在努力使用数据传输对象(DTO)来实现JSON api方面的工作。 我遇到了AutoMapper并且手动编写了一些DTO(仍然认为),这应该是管理DTO的好方法。 所以,新的,通过Nuget安装,我尝试了我的第一个映射。 mblUser类派生自IdentityUser作为源代码,我想要一个简单的APIUser来实现这些类:

    public class mblUser : IdentityUser 
{
    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<mblUser> manager, string authenticationType = DefaultAuthenticationTypes.ApplicationCookie) 
    {
        //authentication type added to provide for Bearer type of authentication. Still defaults to cookie though so as not to impact the code
        // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
        var userIdentity = await manager.CreateIdentityAsync(this, authenticationType );
        // Add custom user claims here
        return userIdentity;
    }
    [Display(Name = "Date of Birth IDVIEW")]
    [DataType(DataType.DateTime)]
    [DisplayFormat(DataFormatString = "{0:d}",
        NullDisplayText = "Please Enter Your Date of Birth", 
        ApplyFormatInEditMode = true)]

    public DateTime? DateOfBirth { get; set; }
    public string Title { get; set; }
    public string FirstName { get; set; }
    public string MiddleName { get; set; }
    public string LastName {get; set;}
    public string DisplayName { get; set; }
    public virtual Leader Leader { get; set;}
    public virtual Guardian Guardian { get; set; }
    public virtual Participant Participant { get; set; }

    [NotMapped]
    [Display(Name ="Full Name")]
    public string FullName
    {
        get
        {
            return FirstName + (MiddleName !=null ? " " + MiddleName : "") + (LastName != null ? " " + LastName :"");
        }
    }
    [NotMapped]
    [Display(Name ="Details Complete")]
    public bool DetailsComplete
    {
        get
        {
            if (string.IsNullOrEmpty(FullName.Trim()) || string.IsNullOrEmpty(Email) ) 
            {
                // set true if we have something of a name and an email address.. 
                return false;
            }
            else
            {
                return true;
            }
        }
    }
}

..并且继承了APIUser:

    public class APIUser
{
    private string Id { get; set; }
    private string Email { get; set; }
    private string UserName { get; set; }
    private string Title { get; set; }
    private string FirstName { get; set; }
    private string MiddleName { get; set; }
    private string LastName { get; set; }
    private string DisplayName { get; set; }
    private string PhoneNumber { get; set; }
}

...继承映射代码:

        // GET: api/userSettings/5
    [ResponseType(typeof(APIUser))]
    public async Task<IHttpActionResult> GetmblUser(string username)
    {
        mblUser User = await UserManager.FindByNameAsync(username);
        if (User == null)
        {
            return NotFound();
        }

        Mapper.CreateMap<mblUser, APIUser>();

        APIUser dto = Mapper.Map<APIUser>(User); <-- here all User members are valid and populated.

        return Ok(dto); <--at a breakpoint here.. all dto members are null.
    }

我认为我必须做某种新手错误或其他什么,但不能弄明白什么?我确实想知道是不是因为mblUser派生自IdentityUser,但文档在该问题上还远未明确。

出于兴趣,我确实发现了另一个似乎与here相关的问题,我确实在我的参考文献和AutoMapper中都有AutoMapper.Net4,但我也看到它在别处需要,所以我是有点卡住.. 任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

您需要先将属性设为公开,然后才能映射。

public class APIUser
{
    public string Id { get; set; }
    public string Email { get; set; }
    public string UserName { get; set; }
    public string Title { get; set; }
    public string FirstName { get; set; }
    public string MiddleName { get; set; }
    public string LastName { get; set; }
    public string DisplayName { get; set; }
    public string PhoneNumber { get; set; }
}