Próbuję zaktualizować złożony model w jednym widoku. Używam ASP.NET MVC3, Entity Framework z Kodeksem pierwszy jednostce pracy, rodzajowy repozytorium wzór .. ale przy próbie aktualizacji modelu, i wymyślić ten błąd:Jak zaktualizować złożony model w środowisku ASP.NET MVC 3
więzów integralności więzów naruszenie wystąpiło: wartości właściwości, które definiują ograniczenia referencyjne, nie są spójne między obiektami głównymi i zależnymi w relacji.
Oto mój model uproszczony widok:
public class TransactionViewModel
{
public Transaction Transaction { get; set; }
public bool IsUserSubmitting { get; set; }
public IEnumerable<SelectListItem> ContractTypes { get; set; }
}
Oto moje uproszczone złożony model, a jako przykład jednej z jego właściwości nawigacji. transakcja ma jeden do jeden związek ze wszystkimi jego właściwościami nawigacja:
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; }
}
użyciu tego samego modelu widoku, jestem w stanie stworzyć przedmiot transakcji, które mogłyby wypełnić bazę takiego.
Id: 1, CurrentStageId: 1, BidId: 1, EvaluationId: 1
ale gdy próbuję zaktualizować właściwości w ciągu tych właściwości nawigacyjnych, linia ta powoduje błąd w sterowniku:
[HttpPost]
public ActionResult Edit(TransactionViewModel model)
{
if (ModelState.IsValid)
{
-> unitOfWork.TransactionRepository.Update(model.Transaction);
unitOfWork.Save();
return RedirectToAction("List");
}
}
w ogólnych repozytorium
public virtual void Update(TEntity entityToUpdate)
{
-> dbSet.Attach(entityToUpdate);
context.Entry(entityToUpdate).State = EntityState.Modified;
}
problem staje się ponadto skomplikowane, ponieważ powinny być w stanie zmienić każdy z obszarów (właściwości) w dowolną właściwość nawigacji w obiekcie Transaction w jednym widoku.
Masz dokładnie rację! Używanie wspólnych kluczy podstawowych do relacji jeden-do-jednego i ręczne ustawianie identyfikatorów w kontrolerze rozwiązało problem. Dzięki! – ljustin
Wystąpił podobny problem, gdy napisałem ogólną bazę klasy repozytorium, którą wszystkie inne repozytoria mogłyby zaimplementować. Upewniając się, że tylko identyfikatory powiązanych podmiotów, które są używane, a nie cały powiązany podmiot rozwiązały mój problem. – Garry
joonho, mam problem. możesz pomóc, w jaki sposób ustawiłeś wartości ręcznie w kontrolerze? – mmssaann