当我的代码到达CampaignRepository.saveChanges()时,它给出了错误,即关系无法修改,关键属性不能为null。但是如果我调试它并查看当前对象的内容,则设置所有主键和外键。我不知道为什么会出错...
public ActionResult Update(LandingPage update)
{
Campaign curr = CampaignRepository.FindById(update.CampaignId);
curr.UpdatePage(update);
CampaignRepository.SaveChanges();
return View("Edit", curr);
}
public void UpdatePage(LandingPage update)
{
foreach (Page page in Pages)
{
if (page.Id == update.Id)
{
Pages.Remove(page);
break;
}
}
Pages.Add(update);
}
de relatie kan niet worden gewijzigd,omdat voor een of meer van de referentiële-sleuteleigenschappen geen null-waarde是toegestaan。 Wanneer een relatie wordt gewijzigd,wordt de gerelateerde referentiële-sleuteleigenschap ingesteld op een null-waarde。 Als de referentiëlelenutelnull-waarden niet ondersteunt,moet er een nieuwe relatie worden gedefinieerd,moetdereferentiële-sleuteleigenschap worden toegewezen aan een andere waarde die niet null是moeten het niet-gerelateerde object worden verwijderd。
更新
我将Update方法更改为:
public ActionResult Update(LandingPage update)
{
Campaign curr = Campaignrepository.FindById(update.CampaignId);
PageRepository.Remove(update);
curr.Pages.Remove(update);
curr.Pages.Add(update);
Campaignrepository.SaveChanges();
return View("Edit", curr);
}
但现在它说“无法删除对象,因为它在ObjectManager中找不到”。
更新2
仍然“无法删除对象,因为它在ObjectManager中找不到”。
//A campaign has Pages property which is a collection of Pages
//This collection contains a two (no more, no less) objects a LandingPage and a RedeemPage
//both LandingPage and RedeemPage have as base Page
//The objective is to replace the old LandingPage with the new version
public ActionResult Update(LandingPage update)
{
//Get the campaign it's about
Campaign curr = Campaignrepository.FindById(update.CampaignId);
//Set the current Page his foreign key values to null
curr.GetLanding().Campaign = null;
curr.GetLanding().CampaignId = 0;
//Remove the (current) page from the repository/context
PageRepository.Remove(update);
//Remove the (current) page from the Campaign collection
curr.Pages.Remove(update);
//Add the new version of the page
curr.Pages.Add(update);
//Save the chances => ObjectManager error
PageRepository.SaveChanges();
return View("Edit", curr);
}
答案 0 :(得分:1)
必须手动逐个从父类Campaign中删除旧子项。实体框架不会这样做。您必须决定要对旧子项执行什么操作 - 将它们丢弃或保留它们并将它们分配给其他父实体。你必须告诉EF你的决定。如果没有对数据库中任何父级的引用,则子实体不能独立生存(由于外键约束)。
关于异常,“无法删除对象,因为在ObjectManager中找不到它”,要对其进行排序,必须将子对象的外键值设置为0.以下是一个示例。 (假设您的父对象是Campaign myCampaign)
myCampaign.ChildCampaign = null;
必须要完成。除了你必须使FK id为0。
myCampaign.ChildCampaignId = 0;
我在之前的项目中遇到了同样的问题,并且能够解决这个问题。希望这会有所帮助。
答案 1 :(得分:1)
您可以尝试更改 UpdatePage 方法:
public void UpdatePage(LandingPage update)
{
var pageToUpdate = this.Pages.Where( p => P.Id == update.Id ).SingleOrDefault();
if( pageToUpdate != null )
{
// update all properties of old page with new values
pageToUpdate.Title = update.Title; // for any property of Page
}
}