Grabar multiples tablas en MVC 5 EF6

June 9, 2017 | Autor: Alfonso Floressq | Categoría: Computer Assisted Language Learning
Share Embed


Descripción

Grabar multiples tablas en MVC 5 EF6 
Desarrollo
 > 
ASP.NET MVC
Pregunta


0

Inicie sesión para votar
Buenas tardes
Tengo un pequeño problema y no entiendo bien como solucionarlo. Estoy trabajando con MVC5, EF 6 sobre Visual Studio 2013.
Tengo un form donde cargo los datos de los alumnos, su domicilio y su visa.

El problema es como haga para grabar todo al mismo tiempo. Es decir que se guarde los datos del alumno, su direccion y su estado de visa al mismo tiempo, ya que lo carga todo en el mismo form.
Si solo quiero guardar el usuario en la base de dato MVC lo hace super sencillo. (despues de usar mucho tiempo web forms esto me parece magico :) )
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "FirstName,LastName,IdStudent,Email,Mobile,Landline,SkypeId,DateOfBirth,ClientNumber,Profile,Photo,Passport,IdAddress,IdVisa,WayComuMail,WayComunPhone,WayComunskype,PhotoMimeType")] Student student,HttpPostedFileBase image=null)
{
if (ModelState.IsValid)
{
if (image != null)
{
student.PhotoMimeType=image.ContentType;
student.Photo = new byte[image.ContentLength];
image.InputStream.Read(student.Photo, 0, image.ContentLength);
}
try
{
db.Students.Add(student);
db.SaveChanges();
return RedirectToAction("Index");
}
catch (DbEntityValidationException e)
{
ViewBag.Text = ObjectHelpers.errorCatched(e);
return View("Error");
}
}

return View("Edit", new StudentViewModel(student));
}
Esto funciona perfecto ya que solo grabo nuevo alumnos, pero como hago ara agregar las demas tablas rlacionadas al alumno.
Estoy lleyendo de ViewModel pero no entiendo muy bien como implementarlo. Si alguien me puede decir cual es la forma correcta de proceder en estos casos?
Desde ya muchas gracias por la info que me pudieran dar.

Ivan

Editado Ivan_Encina jueves, 02 de octubre de 2014 10:20
Cambiado Miguel.Vazquez.MSDN miércoles, 08 de octubre de 2014 23:01
jueves, 02 de octubre de 2014 10:19
Responder
"
Citar

Ivan_Encina
0 Puntos
Respuestas


1

Inicie sesión para votar
>>Esto funciona perfecto ya que solo grabo nuevo alumnos, pero como hago ara agregar las demas tablas rlacionadas al alumno.
como te llegan al controller los demas datos ?
en la view como capturas los datos de la visa, la direccion
porque si al action del controller llegan estos datos insertarlos seria solo ponerlo en las entidades de asociacion, o sea
Visa _visa = new Visa();
_visa.VisaType = ...
//resto propiedades
student.Visas = _visa;
y cuando haces el SaveChange() grabara todo junto al alumno y la visa tambien
pero necesita la info de la visa para poder completar esa entidad, y esto debe llegar desde la view
----
otra duda, porque usas el
[Bind(Include =
por defecto en el post si una propiedad del modelo mapea la cargara directamente, no necesitas especificarla
saludos

Leandro Tuttini

Blog
MVP Profile
Buenos Aires
Argentina
Propuesto como respuesta IvanEncina jueves, 02 de octubre de 2014 19:03
Votado como útil IvanEncina jueves, 02 de octubre de 2014 19:30
Marcado como respuesta Miguel.Vazquez.MSDN miércoles, 08 de octubre de 2014 23:00
jueves, 02 de octubre de 2014 11:42
Responder
"
Citar

Leandro Tuttini
Lagash
(MCC, Partner, MVP)
739,675 Puntos


0

Inicie sesión para votar
hola
pero si tienes otras entidades tambien puede editarlas
@Html.TextBoxFor(model => model.Address.City, new { htmlAttributes = new { @class = "form-control" } })
enonces cuando envies el post al action si defines una entidad Student tambien completara la entidad compleja de Adress
pero cuidado si defines el atributo [Bind(Include porque puede que te corte el binde de las demas entidades
saludos

Leandro Tuttini

Blog
MVP Profile
Buenos Aires
Argentina

Editado Leandro TuttiniMVP jueves, 02 de octubre de 2014 19:46
Marcado como respuesta Miguel.Vazquez.MSDN miércoles, 08 de octubre de 2014 23:00
jueves, 02 de octubre de 2014 18:38
Responder
"
Citar

Leandro Tuttini
Lagash
(MCC, Partner, MVP)
739,675 Puntos
Todas las respuestas


1

Inicie sesión para votar
>>Esto funciona perfecto ya que solo grabo nuevo alumnos, pero como hago ara agregar las demas tablas rlacionadas al alumno.
como te llegan al controller los demas datos ?
en la view como capturas los datos de la visa, la direccion
porque si al action del controller llegan estos datos insertarlos seria solo ponerlo en las entidades de asociacion, o sea
Visa _visa = new Visa();
_visa.VisaType = ...
//resto propiedades
student.Visas = _visa;
y cuando haces el SaveChange() grabara todo junto al alumno y la visa tambien
pero necesita la info de la visa para poder completar esa entidad, y esto debe llegar desde la view
----
otra duda, porque usas el
[Bind(Include =
por defecto en el post si una propiedad del modelo mapea la cargara directamente, no necesitas especificarla
saludos

Leandro Tuttini

Blog
MVP Profile
Buenos Aires
Argentina
Propuesto como respuesta IvanEncina jueves, 02 de octubre de 2014 19:03
Votado como útil IvanEncina jueves, 02 de octubre de 2014 19:30
Marcado como respuesta Miguel.Vazquez.MSDN miércoles, 08 de octubre de 2014 23:00
jueves, 02 de octubre de 2014 11:42
Responder
"
Citar

Leandro Tuttini
Lagash
(MCC, Partner, MVP)
739,675 Puntos


0

Inicie sesión para votar
Muchas gracias Leandro por tu respuesta.
Soy nuevo en MVC, por lo tanto voy por partes. El codigo que copie arriba, solo agrega al Student. Quiero ir por partes asi que primero hago un CRUD solamente del estudiante. Una vez que funciono todo bien, dije bueno ahora agrego la direccion y el tipo de visa y ahi es donde me complique. Por que hay muchisimos tutoriales pero siempre trabajan con un solo entidad y en este caso son 3 entidades que tengo que hacerle el CRUD al mismo tiempo.
Este es la view donde capturo solamente los datos del student por ahora. La idea es que en este mismo form cargue los datos de las 3 entidades mencionadas arriba.
@model SRM2014CBeta.Models.StudentViewModel
@{ ViewBag.Title = "Create";
Layout = "~/Views/Shared/_Layout.cshtml";

}

@*@Model.PageTitle*@

@using (Html.BeginForm(Model.EditorAction, "Students", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
@Html.AntiForgeryToken()




@Model.PageTitle



@Html.HiddenFor(model => model.IdStudent);
@Html.ValidationSummary(true, "", new { @class = "text-danger" })


@Html.LabelFor(model => model.FirstName, htmlAttributes: new { @class = "control-label" })
@Html.EditorFor(model => model.FirstName, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.FirstName, "", new { @class = "text-danger" })


@Html.LabelFor(model => model.LastName, htmlAttributes: new { @class = "control-label" })
@Html.EditorFor(model => model.LastName, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.LastName, "", new { @class = "text-danger" })


@Html.LabelFor(model => model.Email, htmlAttributes: new { @class = "control-label" })

@Html.EditorFor(model => model.Email, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Email, "", new { @class = "text-danger" })


@Html.LabelFor(model => model.Mobile, htmlAttributes: new { @class = "control-label" })

@Html.EditorFor(model => model.Mobile, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Mobile, "", new { @class = "text-danger" })


@Html.LabelFor(model => model.Landline, htmlAttributes: new { @class = "control-label" })

@Html.EditorFor(model => model.Landline, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Landline, "", new { @class = "text-danger" })


@Html.LabelFor(model => model.SkypeId, htmlAttributes: new { @class = "control-label" })

@Html.EditorFor(model => model.SkypeId, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.SkypeId, "", new { @class = "text-danger" })




Preferred way of contact


Mail: @Html.CheckBoxFor(model => model.WayComuMail)


Phone: @Html.CheckBoxFor(model => model.WayComunPhone)


Skype: @Html.CheckBoxFor(model => model.WayComunskype)








@Html.LabelFor(model => model.DateOfBirth, htmlAttributes: new { @class = "control-label" })

@Html.EditorFor(model => model.DateOfBirth, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.DateOfBirth, "", new { @class = "text-danger" })


@Html.LabelFor(model => model.ClientNumber, htmlAttributes: new { @class = "control-label" })

@Html.EditorFor(model => model.ClientNumber, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.ClientNumber, "", new { @class = "text-danger" })



@Html.Partial("_UploadPhotoPartial")



@Html.LabelFor(model => model.Profile, htmlAttributes: new { @class = "control-label" })

@Html.EditorFor(model => model.Profile, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Profile, "", new { @class = "text-danger" })



@Html.LabelFor(model => model.Passport, htmlAttributes: new { @class = "control-label" })*

@Html.EditorFor(model => model.Passport, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Passport, "", new { @class = "text-danger" })




@Html.LabelFor(model => model.IdAddress, "IdAddress", htmlAttributes: new { @class = "control-label" })

@Html.DropDownList("IdAddress", null, htmlAttributes: new { @class = "form-control" })
@Html.ValidationMessageFor(model => model.IdAddress, "", new { @class = "text-danger" })




@Html.LabelFor(model => model.IdVisa, "IdVisa", htmlAttributes: new { @class = "control-label" })

@Html.DropDownList("IdVisa", null, htmlAttributes: new { @class = "form-control" })
@Html.ValidationMessageFor(model => model.IdVisa, "", new { @class = "text-danger" })











}

@Html.ActionLink("Back to List", "Index")


Con relacion al [Bind(Include=...MVC lo puso por defecto. Yo no agregue nada.
Ivan




Editado Ivan_Encina jueves, 02 de octubre de 2014 18:04
jueves, 02 de octubre de 2014 17:59
Responder
"
Citar

Ivan_Encina
0 Puntos


0

Inicie sesión para votar
hola
pero si tienes otras entidades tambien puede editarlas
@Html.TextBoxFor(model => model.Address.City, new { htmlAttributes = new { @class = "form-control" } })
enonces cuando envies el post al action si defines una entidad Student tambien completara la entidad compleja de Adress
pero cuidado si defines el atributo [Bind(Include porque puede que te corte el binde de las demas entidades
saludos

Leandro Tuttini

Blog
MVP Profile
Buenos Aires
Argentina

Editado Leandro TuttiniMVP jueves, 02 de octubre de 2014 19:46
Marcado como respuesta Miguel.Vazquez.MSDN miércoles, 08 de octubre de 2014 23:00
jueves, 02 de octubre de 2014 18:38
Responder
"
Citar

Leandro Tuttini
Lagash
(MCC, Partner, MVP)
739,675 Puntos


0

Inicie sesión para votar
Gracias de nuevo Leandro!
Que tengas un buen dia
Saludos


Lihat lebih banyak...

Comentarios

Copyright © 2017 DATOSPDF Inc.