Estoy probando Entity Framework Code first CTP4. Supongamos que tengo:¿Puede el Automapper asignar una clave externa a un objeto utilizando un repositorio?
public class Parent
{
public int Id { get; set; }
public string Name { get; set; }
}
public class Child
{
public int Id { get; set; }
public string Name { get; set; }
public Parent Mother { get; set; }
}
public class TestContext : DbContext
{
public DbSet<Parent> Parents { get; set; }
public DbSet<Child> Children { get; set; }
}
public class ChildEdit
{
public int Id { get; set; }
public string Name { get; set; }
public int MotherId { get; set; }
}
Mapper.CreateMap<Child, ChildEdit>();
La asignación al modelo de edición no es un problema. En mi pantalla selecciono la madre a través de algún tipo de control (lista desplegable, Autocompleter, etc) y el ID de la madre se ha escrito en la espalda:
[HttpPost]
public ActionResult Edit(ChildEdit posted)
{
var repo = new TestContext();
var mapped = Mapper.Map<ChildEdit, Child>(posted); // <------- ???????
}
¿Cómo debería resolver el último mapeo? No quiero poner Mother_Id en el objeto Child. Por ahora uso esta solución, pero espero que se pueda resolver en Automapper.
Mapper.CreateMap<ChildEdit, Child>()
.ForMember(i => i.Mother, opt => opt.Ignore());
var mapped = Mapper.Map<ChildEdit, Child>(posted);
mapped.Mother = repo.Parents.Find(posted.MotherId);
EDITAR Esto funciona, pero ahora tengo que ver que para cada clave externa (Por cierto: contexto sería inyectado en la solución final):
Mapper.CreateMap<ChildEdit, Child>();
.ForMember(i => i.Mother,
opt => opt.MapFrom(o =>
new TestContext().Parents.Find(o.MotherId)
)
);
Lo que me gusta mucho sería:
Mapper.CreateMap<int, Parent>()
.ForMember(i => i,
opt => opt.MapFrom(o => new TestContext().Parents.Find(o))
);
Mapper.CreateMap<ChildEdit, Child>();
¿Eso es posible con Automapper?
Funciona como un amuleto. Gracias. –
¿Podría mostrarme cómo usar su solución cuando quiero asignar el ID a la entidad? Me refiero a cómo mapear cuando implementé todo? – user2412672