我想在單個視圖中更新複雜模型。 我使用ASP.NET MVC3,實體框架與代碼首先,工作單位,通用倉庫模式.. 但是當我嘗試更新的模式,我想出了這個錯誤:如何更新ASP.NET MVC中的複雜模型3
參照完整性約束髮生違規:定義參照約束的屬性值在關係中的主體和從屬對象之間不一致。
這是我的簡化視圖模型:
public class TransactionViewModel
{
public Transaction Transaction { get; set; }
public bool IsUserSubmitting { get; set; }
public IEnumerable<SelectListItem> ContractTypes { get; set; }
}
這是我的簡化複雜的模型,並作爲一個例子它的導航屬性之一。 交易與所有的導航屬性的一一對應的關係:
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; }
}
使用相同的視圖模型,我可以創建一個交易對象,這將填充這樣的數據庫。
ID:1,CurrentStageId:1,BidId:1,EvaluationId:1
但是,當我嘗試這些導航屬性內更新屬性,這條線將導致誤差,在控制器:
[HttpPost]
public ActionResult Edit(TransactionViewModel model)
{
if (ModelState.IsValid)
{
-> unitOfWork.TransactionRepository.Update(model.Transaction);
unitOfWork.Save();
return RedirectToAction("List");
}
}
在通用存儲庫:
public virtual void Update(TEntity entityToUpdate)
{
-> dbSet.Attach(entityToUpdate);
context.Entry(entityToUpdate).State = EntityState.Modified;
}
問題進一步複雜化,因爲我應該可以編輯任何中的字段(屬性)的單個視圖中的Transaction對象內的任何導航屬性。
你是完全正確!使用共享主鍵爲一比一的關係和手動設置在控制器的ID解決了這個問題。謝謝! – ljustin 2012-01-25 14:05:19
我正在經歷我在那裏寫了所有其他存儲庫可以實現一個通用基倉儲類有類似的問題。通過確保只有使用相關實體的ID而不是整個相關實體解決了我的問題。 – Garry 2012-12-05 19:32:45
joonho,遇到的問題IM。你能幫助你如何在控制器中手動設置數值嗎? – mmssaann 2013-06-14 07:06:43