我有以下型号:
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 或?
中的命名答案 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