Ich habe hier http://lostechies.com/jimmybogard/2009/09/18/the-case-for-two-way-mapping-in-automapper/ darüber gelesen, wie Sie wahrscheinlich nicht versuchen, ein abgeflachtes Objekt zu entlasten, sondern darüber nachdenken, wie ich ein Repository mit Entity verwenden Framework werden die Entity-Modelle erwartet, nicht die ViewModels.Domain-Modell zu ViewModel und wieder mit Repository-Muster und Entity Framework in MVC3
Ich begann mich zu fragen, ob ich einen anderen Ansatz verfolgen sollte, hat jemand Best Practices für so etwas? oder ist es an der Zeit, ValueInjector Using AutoMapper to unflatten a DTO zu verwenden? und nicht zu sehr damit beschäftigt, RecipeCreateViewModel zurück zu Rezept zu mappen?
Unten ist mein Code, um Ihnen eine Vorstellung davon zu geben, was ich im Moment habe.
// Entities
public class Recipe {
public int Id { get; set; }
public string Name { get; set; }
public Course Course { get; set; }
}
public class Course {
public int Id { get; set; }
public string Name { get; set; }
}
// View Model
public class RecipeCreateViewModel {
// Recipe properties
public int Id { get; set; }
public string Name { get; set; }
// Course properties, as primitives via AutoMapper
[Required]
public int CourseId { get; set; }
// Don't need CourseName in the viewmodel but it should probably be set in Recipe.Course.Name
//public string CourseName { get; set; }
// For a drop down list of courses
public SelectList CourseList { get; set; }
}
// Part of my View
@model EatRateShare.WebUI.ViewModels.RecipeCreateViewModel
...
<div class="editor-label">
Course
</div>
<div class="editor-field">
@* The first param for DropDownListFor will make sure the relevant property is selected *@
@Html.DropDownListFor(model => model.CourseId, Model.CourseList, "Choose...")
@Html.ValidationMessageFor(model => model.CourseId)
</div>
...
// Controller actions
public ActionResult Create() {
// map the Recipe to its View Model
var recipeCreateViewModel = Mapper.Map<Recipe, RecipeCreateViewModel>(new Recipe());
recipeCreateViewModel.CourseList = new SelectList(courseRepository.All, "Id", "Name");
return View(recipeCreateViewModel);
}
[HttpPost]
public ActionResult Create(RecipeCreateViewModel recipe) {
if (ModelState.IsValid) {
// set the course name based on the id that was posted
// not currently checking if the repository doesn't find anything.
recipe.CourseName = courseRepository.Find(recipe.CourseId).Name;
var recipeEntity = Mapper.Map<RecipeCreateViewModel, Recipe>(recipe);
recipeRepository.InsertOrUpdate(recipeEntity);
recipeRepository.Save();
return RedirectToAction("Index");
} else {
recipe.CourseList = new SelectList(courseRepository.All, "Id", "Name");
return View(recipe);
}
}
Vielen Dank für Die Antwort Mike, meine Frage war nicht sehr klar, da ich mich über einige Dinge nicht sicher bin und mehrere Dinge auf einmal anfordere .. ich schließe das ab und Sie haben eine schöne klare Vorstellung von den Erstellungs- und Anzeigeebenen gegeben. Das Problem, mit dem ich zu kämpfen hatte, war das Mapping zurück vom Viewmodel. – Pricey
@MikeSW Warum überspringen Sie das Domänenmodell bei der Konvertierung zurück von PM zu VM? Ist es nicht besser, Ihre VM von DM aus zuzuordnen? Auf diese Weise machst du es nur einmal in deiner oberen Schicht. –
@ JoaoLeme Es ist nicht. Das Anzeigen des Modells der Update-Ansicht erfordert nur gespeicherte Daten aus dem Modell, das bereits von der Persistenz-Entität verfügbar ist. Anstatt also das gesamte Objekt zu füllen, frage ich direkt den Speicher ab, um die relevanten Daten zu erhalten. Es ist ziemlich viel CQRS – MikeSW