我有兩個表,促進和PromotionLine,被定義爲PromotionLine.PromoID = Promotion.ID如何將更改保存到相關表中MVC 5和6 EF - 實體框架主詳細
PromotionLines是一個外鍵具有促進模型相關聯在促進類以下內容:
public IList<PromotionLine> PromotionLineItems { get; set; }
我選擇不使用虛擬,因爲我不想,如果我們只是使用摘要視圖呈現高位水平提升加載的促銷行信息(例如促銷列表)。
當需要推廣的細節,我得到了推廣線:
public static Promotion GetInstance(int? promotionId)
{
if (promotionId == null) return null;
using (APP01Entities entities = new APP01Entities())
{
return entities.Promotions
.Include(s => s.PromotionState)
.Include(h => h.PromotionHeaderType)
.Include(l => l.PromotionLineItems)
.Include(c => c.PromotionComments)
.FirstOrDefault(p => p.ID == promotionId);
}
}
這工作,我可以在我看來訪問推廣線。
然而,當我去更新的變化,我遇到的錯誤:
「A referential integrity constraint violation occurred: The property value(s) of 'Promotion.ID' on one end of a relationship do not match the property value(s) of 'PromotionLine.PromotionID' on the other end.」
我明白爲什麼這個錯誤發生。我不知道如何繞過它。 我使用的是默認的更新方法(由EF腳手架創建):
public bool Update()
{
try
{
using (APP01Entities entities = new APP01Entities())
{
entities.Promotions.Attach(this);
var entity = entities.ChangeTracker.Entries<Promotion>().FirstOrDefault(e => e.Entity == this);
if (entity == null)
{
return false;
}
entity.State = EntityState.Modified;
entities.SaveChanges();
}
return true;
}
catch (System.Data.Entity.Validation.DbEntityValidationException e)
{
throw e.Improve();
}
}
的問題是:
entities.Promotions.Attach(this);
「這個」 具有推廣線。實體。促銷沒有。
這裏是我如何調用更新方法:
[HttpPost]
public ActionResult Edit(Promotion promotion)
{
if (ModelState.IsValid)
{
promotion.Update();
}
return View(promotion);
}
問題
- 我如何推廣線添加到entities.Promotions?
- 或者,我應該以不同的方式接近此更新嗎?
什麼是你的推廣模板編輯樣的? –
有沒有更改孩子列表?例如添加到'PromotionLineItems'的一些項目和'PromotionComments'的一些項目被移除並且......? –
@RezaAghaei - 是的,子列表已更改(例如,PromotionLineItems中的值已更改)。 –