繁体   English   中英

ASP.NET MVC EF代码优先:无法修改关系

[英]ASP.NET MVC EF Code first: Relation can not be modified

当我的代码到达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 vandereferentiële-sleuteleigenschappen geen null-waarde is toegestaan​​。 Wanneer een relatie wordt gewijzigd,wordt degerelateerdereferentiële-sleuteleigenschap ingesteld op een null-waarde。 Als dereferentiëlelesutelnull-waarden niet ondersteunt,moet er een nieuwe relatie worden gedefinieerd,moetdereferentiële-sleuteleigenschap worden toegewezen anan 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);
}

必须手动从父类Campaign逐个删除旧子项。 实体框架不会这样做。 您必须决定要对旧子项执行什么操作 - 将它们丢弃或保留它们并将它们分配给其他父实体。 你必须告诉EF你的决定。 如果没有引用数据库中的任何父级(由于外键约束),子实体不能独立生活。

关于异常,“无法删除对象,因为它在ObjectManager中找不到”,要对其进行排序,您必须将子对象的外键值设置为0.以下是一个示例。 (假设您的父对象是Campaign myCampaign)

myCampaign.ChildCampaign = null;

必须要做。 除了你必须使FK id为0。

myCampaign.ChildCampaignId = 0;

我在之前的项目中遇到了同样的问题,并且能够解决这个问题。 希望这可以帮助。

你可以尝试更改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
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM