2012-09-28 42 views
1

我有以下型號:如何使用Automapper在複雜類型上傳的圖片(MVC +實體框架)

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

現在的問題是,我怎麼能用automapper映射那些?我的意思是,ProfileImage還需要PersonId(插入時可以由實體框架插入)。我是否需要更改ViewModel中的命名或?

+0

是'Name'一個人的唯一標識符? –

回答

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

它時,試圖更新/刪除現有的配置文件的圖像,而不是每次都只是增加了他們變得有點麻煩,我還有一個計算器的答案進入,在更詳細 - When using DTOs, Automapper & Nhibernate reflecting changes in child collections of DTO in domain object being updated

+0

您可以再進一步,將InputStream到字節數組邏輯的轉換添加到擴展方法中。如果您使用的是.NET 4或更高版本,請使用以下代碼 - http://stackoverflow.com/a/7073124/335545 – Bern