J'essaie de mettre à jour un modèle complexe dans une vue unique. J'utilise ASP.NET MVC3, Entity Framework avec le code en premier lieu, unité de travail, modèle de référentiel générique .. mais lorsque je tente de mettre à jour le modèle, je viens avec cette erreur:Comment mettre à jour un modèle complexe dans ASP.NET MVC 3
Une contrainte d'intégrité référentielle violation survenue: Les valeurs de propriété qui définissent les contraintes référentielles ne sont pas cohérentes entre les objets principaux et dépendants dans la relation.
Voici mon modèle de vue simplifiée:
public class TransactionViewModel
{
public Transaction Transaction { get; set; }
public bool IsUserSubmitting { get; set; }
public IEnumerable<SelectListItem> ContractTypes { get; set; }
}
Voici mon modèle complexe simplifié, et à titre d'exemple un de ses biens de navigation. Transaction a une relation biunivoque avec toutes ses propriétés de navigation:
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; }
}
En utilisant le même modèle de vue, je suis en mesure de créer un objet de transaction, qui peupler la base de données comme celui-ci.
Id: 1, CurrentStageId: 1, BidId: 1, EvaluationId: 1
mais, lorsque je tente de mettre à jour des propriétés au sein de ces propriétés de navigation, cette ligne provoque l'erreur, dans le contrôleur:
[HttpPost]
public ActionResult Edit(TransactionViewModel model)
{
if (ModelState.IsValid)
{
-> unitOfWork.TransactionRepository.Update(model.Transaction);
unitOfWork.Save();
return RedirectToAction("List");
}
}
dans le référentiel générique:
public virtual void Update(TEntity entityToUpdate)
{
-> dbSet.Attach(entityToUpdate);
context.Entry(entityToUpdate).State = EntityState.Modified;
}
Le problème est encore compliqué parce que je devrais être en mesure de modifier l'un des champs (propriétés) dans l'une des propriétés de navigation dans l'objet Transaction dans une vue unique.
Vous aviez parfaitement raison! L'utilisation de clés primaires partagées pour une relation un-à-un et la définition manuelle des ID dans le contrôleur ont résolu le problème. Merci! – ljustin
J'ai rencontré un problème similaire où j'avais écrit une classe de référentiel de base générique que tous les autres référentiels pouvaient implémenter. En veillant à ce que seuls les identifiants des entités liées où ils étaient utilisés plutôt que toute l'entité liée résolvent mon problème. – Garry
joonho, im ayant le problème. pouvez-vous aider comment avez-vous défini manuellement les valeurs dans les contrôleurs? – mmssaann