Estoy tratando de actualizar un modelo complejo en una sola vista. estoy usando ASP.NET MVC3, Marco de la entidad con el código en primer lugar, unidad de trabajo, patrón de repositorio genérico .. pero cuando trato de actualizar el modelo, se me ocurre este error:Cómo actualizar el modelo complejo en ASP.NET MVC 3
Una restricción de integridad referencial se produjo una infracción: los valores de las propiedades que definen las restricciones referenciales no son consistentes entre los objetos principales y dependientes en la relación.
Aquí es mi modelo de vista simplificada:
public class TransactionViewModel
{
public Transaction Transaction { get; set; }
public bool IsUserSubmitting { get; set; }
public IEnumerable<SelectListItem> ContractTypes { get; set; }
}
Aquí está mi complejo modelo simplificado, y como ejemplo uno de su propiedad de navegación. Transacción tiene relación uno a uno con todas sus propiedades de navegación:
public class Transaction
{
[Key]
public int Id { get; set; }
public int CurrentStageId { get; set; }
public int? BidId { get; set; }
public int? EvaluationId { get; set; }
public virtual Stage CurrentStage { get; set; }
public virtual Bid Bid { get; set; }
public virtual Evaluation Evaluation { get; set; }
}
public class Bid
{
[Key]
public int Id { get; set; }
public string Type { get; set; }
public DateTime? PublicationDate { get; set; }
public DateTime? BidOpeningDate { get; set; }
public DateTime? ServiceDate { get; set; }
public string ContractBuyerComments { get; set; }
public string BidNumber { get; set; }
public DateTime? ReminderDate { get; set; }
public DateTime? SubmitDate { get; set; }
}
Utilizando el mismo modelo de vista, yo soy capaz de crear un objeto de transacción, lo que poblar la base de datos como este.
Id: 1, CurrentStageId: 1, BidId: 1, EvaluationId: 1
pero, cuando intento para actualizar las propiedades dentro de estas propiedades de navegación, esta línea hace que el error, en el controlador:
[HttpPost]
public ActionResult Edit(TransactionViewModel model)
{
if (ModelState.IsValid)
{
-> unitOfWork.TransactionRepository.Update(model.Transaction);
unitOfWork.Save();
return RedirectToAction("List");
}
}
En repositorio genérico:
public virtual void Update(TEntity entityToUpdate)
{
-> dbSet.Attach(entityToUpdate);
context.Entry(entityToUpdate).State = EntityState.Modified;
}
El problema se complica aún más porque debería ser capaz de modificar cualquiera de los campos (propiedades) dentro de cualquiera de las propiedades de navegación dentro del objeto Transaction dentro de una vista única.
¡Estabas exactamente en lo cierto! El uso de claves primarias compartidas para la relación uno-a-uno y la configuración manual de las ID en el controlador resolvió el problema. ¡Gracias! – ljustin
Estaba experimentando un problema similar en el que había escrito una clase de repositorio base genérica que todos los demás repositorios podrían implementar. Asegurándome de que solo las ID de las entidades relacionadas se usaran en lugar de toda la entidad relacionada, resolvió mi problema. – Garry
joonho, estoy teniendo el problema. ¿Puedes ayudarnos a configurar los valores manualmente en los controladores por favor? – mmssaann