何が背後にあるのかを理解し、それを自分で行う方法を学びたいので、 Model
toViewModel
とViewModel
toModel
を変換する良い方法を知りたいです。AutoMapper
もちろん、モデルとは、EFによって生成されたクラスを意味します。
これまでにこのようなものを作成しましたが、ネストされたクラスが関係する場合、いくつかの問題があります。
// to VM
public static Author ToViewModel(EntityAuthor author)
{
if (author == null)
return null;
Author result = new Author();
result.Id = author.ATH_ID;
result.FirstName = author.ATH_FirstName;
result.LastName = author.ATH_LastName;
return result;
}
public static BlogPost ToViewModel(EntityBlogPost post)
{
if (post == null)
return null;
Experiment result = new Experiment();
result.Id = post.BP_ID;
result.Title = post.BP_Title;
result.Url = post.BP_Url;
result.Description = post.BP_Description;
result.Author = ToViewModel(post.Author);
return result;
}
// from VM
public static EntityAuthor ToModel(Author author)
{
if (author == null)
return null;
EntityAuthor result = new EntityAuthor();
result.ATH_ID= author.Id;
result.ATH_FirstName = author.FirstName;
result.ATH_LastName = author.LastName;
return result;
}
public static EntityBlogPost ToModel(BlogPost post)
{
if (post == null)
return null;
EntityBlogPost result = new EntityBlogPost();
result.BP_ID = post.Id;
result.BP_Title = post.Title;
result.BP_Url = post.Url;
result.BP_Description = post.Description;
result.Author = ToModel(post.Author);
return result;
}
注:EntityBlogPost
は、への外部キーを保持しますEntityAuthor
。私が今直面している問題の1つは、BlogPostを編集する場合、対応するエンティティで作成者の外部キー「BP_ATH_ID」を設定する必要がありますが、編集した投稿の作成者が「null」であるため、これは「0」です。著者をhttp-postしたくありません。それでも、(http-get中に)表示したいので、作成者はビューモデルにいる必要があります。これが私のコントローラーです(ビューは重要ではありません):
// GET: I make use of Author for this
public ActionResult Edit(int id)
{
return View(VMConverter.ToViewModel(new BlogPostService().GetByID(id)));
}
//
// POST: I don't make use of Author for this
[HttpPost]
public ActionResult Edit(BlogPost input)
{
if (ModelState.IsValid)
{
new BlogPostService().Update(VMConverter.ToModel(input));
return RedirectToAction("List");
}
return View(input);
}
現時点では、コントローラーの背後にいくつかのサービスModel
があり、これらは(私のコードでわかるように)上でのみ機能します。この「サービスレイヤー」を他のアプリケーションにも再利用することが目的でした。
public void Update(EntityBlogPost post)
{
// let's keep it simple for now
this.dbContext.Entry(post).State = EntityState.Modified;
this.dbContext.SaveChanges();
}
では、私の質問に戻りましょう。この遷移Model->ViewModelを処理して戻るための良い方法は何でしょうか?