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 も必要です (挿入時に Entity Framework によって挿入される可能性があります)。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の周りで手間のかかる作業を行うため、personエンティティを自分で作成し、最初にコンテキストに追加する必要がありますが、必ずしもそうとは限りません。

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

既存のプロファイル画像を毎回追加するのではなく、更新/削除しようとすると少し注意が必要になります。別のスタックオーバーフローの答えが詳細に説明されています-DTOを使用する場合、DTOの子コレクションの変更を反映するAutomapper&Nhibernate更新中のドメインオブジェクト

于 2012-10-07T09:10:59.550 に答える