1

我有以下型号:

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; }        
        }

我的视图模型:

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

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

现在我的问题是,如何使用自动映射器映射它们?我的意思是 ProfileImage 还需要 PersonId(可以在插入时由实体框架插入)。我需要更改ViewModel中的命名吗?

4

1 回答 1

2

我将假定 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 周围进行繁重的工作,您可能需要自己创建人员实体并首先将其添加到上下文中,但不是必须的。

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

当尝试更新/删除现有的配置文件图像而不是每次都添加它们时,它会变得有点棘手,我有另一个 stackoverflow 答案更详细地介绍了 -当使用 DTO、Automapper 和 Nhibernate 时,反映了 DTO 的子集合的变化正在更新的域对象

于 2012-10-07T09:10:59.550 回答