Sto tentando di aggiornare un modello complesso in una singola vista. Sto usando ASP.NET MVC3, Entity Framework con il codice prima, unità di lavoro, modello repository generico .. ma quando provo ad aggiornare il modello, vengo con questo errore:Come aggiornare il modello complesso in ASP.NET MVC 3
Un vincolo di integrità referenziale violazione verificatasi: i valori delle proprietà che definiscono i vincoli referenziali non sono coerenti tra gli oggetti principale e dipendente nella relazione.
Ecco il mio semplificato modello di vista:
public class TransactionViewModel
{
public Transaction Transaction { get; set; }
public bool IsUserSubmitting { get; set; }
public IEnumerable<SelectListItem> ContractTypes { get; set; }
}
Ecco il mio modello complesso semplificato, e come esempio uno dei suoi proprietà di navigazione. transazione ha relazione uno a uno con tutte le sue proprietà di navigazione:
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; }
}
Utilizzando lo stesso modello di vista, sono in grado di creare un oggetto di transazione, che avrebbe popolare il database come questo.
Id: 1, CurrentStageId: 1, BidId: 1, EvaluationId: 1
ma, quando provo ad aggiornare le proprietà all'interno di queste proprietà di navigazione, questa linea causa l'errore, nel regolatore:
[HttpPost]
public ActionResult Edit(TransactionViewModel model)
{
if (ModelState.IsValid)
{
-> unitOfWork.TransactionRepository.Update(model.Transaction);
unitOfWork.Save();
return RedirectToAction("List");
}
}
In repository generico:
public virtual void Update(TEntity entityToUpdate)
{
-> dbSet.Attach(entityToUpdate);
context.Entry(entityToUpdate).State = EntityState.Modified;
}
Il problema è ulteriormente complicato perché dovrei essere in grado di modificare uno qualsiasi dei campi (proprietà) all'interno qualsiasi proprietà di navigazione nell'oggetto Transaction all'interno di una singola vista.
Avevi esattamente ragione! L'utilizzo di chiavi primarie condivise per la relazione uno a uno e l'impostazione manuale degli ID nel controller ha risolto il problema. Grazie! – ljustin
Ho riscontrato un problema simile in cui avevo scritto una classe di repository di base generica che tutti gli altri repository potevano implementare. Garantendo che solo gli ID delle entità correlate dove sono stati utilizzati piuttosto che l'intera entità correlata hanno risolto il mio problema. – Garry
joonho, sto avendo il problema. puoi aiutarmi come hai impostato manualmente i valori in controller pls? – mmssaann