如何在复杂类型中使用Automapper与上传的图像(MVC +实体框架)

时间:2012-09-28 08:44:04

标签: asp.net-mvc entity-framework automapper

我有以下型号:

public abstract class PersonBase : EntityWithTypedId
    {
        public PersonBase()
        {
            this.ProfileImages = new List<ProfileImage>();
        }

        public string name;

        [Required]
        public string Name
        {
            get { return name; } 
            set
            {
                name = value;
                this.UrlFriendlyName = value.ToUrlFriendly();
            }
        }

        public string UrlFriendlyName { get; protected set; }

        [UIHint("UploadImage")]
        public List<ProfileImage> ProfileImages { get; set; }
    }



public class ProfileImage
        {
            public int PersonId { get; set; }

            public byte[] Image { get; set; }        
        }

我的viewmodel:

public class PersonDetailsViewModel
    {
        public string Name { get; set; }

        public IEnumerable<HttpPostedFilebase> ProfileImages { get; set; }
    }

现在我的问题是,如何使用automapper映射?我的意思是ProfileImage还需要PersonId(可以在插入时由Entity Framework插入)。我是否需要更改 ViewModel 或?

中的命名

1 个答案:

答案 0 :(得分:0)

我将假设personId是您的编辑路线值的一部分。

[HttpPost]
public ActionResult Edit(int personId, PersonDetailsViewModel viewModel) {
    var entity = dbContext.//load entity by PersonId;
    AutoMapper.Map(viewModel, entity);
    dbContext.SaveChanges();
}

在某处启动

AutoMapper.Create<PersonDetailsViewModel, PersonBase>();
AutoMapper.Create<HttpPostedFilebase, ProfileImage>()
    .ForMember(d => d.PersonId, opt => opt.Ignore())
    .ForMember(d => d.Image, opt => opt.MapFrom(s => {
        MemoryStream target = new MemoryStream();
        model.File.InputStream.CopyTo(target);
        return target.ToArray();
    });

如果您在EF中正确设置了人物/个人资料图像关系并且您已启用更改跟踪(默认情况下应该打开),EF应自动找出图像的PersonId。

对于插入它也应该正常工作,EF在personId周围进行繁重的工作,你可能需要自己创建person实体并首先将其添加到上下文中,但不是必须的。

public ActionResult Add(PersonDetailsViewModel viewModel) {
    var entity = new PersonBase();
    dbContext.Add(entity);
    AutoMapper.Map(viewModel, entity);
    dbContext.SaveChanges();
}

尝试更新/删除现有的配置文件图像时,有点棘手,而不是每次只添加它们,我有另一个stackoverflow答案更详细地进入 - When using DTOs, Automapper & Nhibernate reflecting changes in child collections of DTO in domain object being updated