更新实体时出现异常“无法更改关系,因为一个或多个外键属性不可为空”

Posted

技术标签:

【中文标题】更新实体时出现异常“无法更改关系,因为一个或多个外键属性不可为空”【英文标题】:Getting exception "The relationship could not be changed because one or more of the foreign-key properties is non-nullable" when update an entity 【发布时间】:2012-09-06 23:10:31 【问题描述】:

我有以下型号。

public class Site

    public int Id  get; set; 
    public string SiteName  get; set; 
    public string SiteUrl  get; set; 
    public IEnumerable<SiteBrand> SiteBrands  get; set; 


public class SiteBrand

    public int Id  get; set; 
    public int SiteId  get; set; 
    public int BrandId  get; set; 
    public SiteConfiguration SiteConfiguration  get; set; 

SiteBrand 在站点的 SiteId 上有一个外键。

我正在尝试以这种方式更新我的站点实体。

public bool Update(Site item)

    try
    
        if (item == null)
            return false;

        var itemToUpdate =
            _dbContext.SiteConfigurations.FirstOrDefault(ua => ua.Id == item.Id);

        if (itemToUpdate == null)
            return false;

        itemToUpdate.SiteName = item.SiteName;

        itemToUpdate.SiteBrands = item.SelectedBrands.Select(
            br =>
            new DataEntities.Siteconfig.SiteBrand BrandId = br).ToList();

        _dbContext.SaveChanges(); // Save changes.

        return true;
    
    catch (Exception e)
    
        throw new Exception(e.Message);
    

但上面的代码抛出了以下异常。

操作失败:无法更改关系,因为 一个或多个外键属性不可为空。当一个 对关系进行更改,相关的外键属性是 设置为空值。如果外键不支持空值, 必须定义一个新的关系,外键属性必须是 分配了另一个非空值,或者不相关的对象必须是 已删除。

我认为我收到此错误是因为我试图在不清除现有外键条目的情况下更新我的站点实体。我不确定它是否正确,也不知道如何解决这个问题。有人可以帮我解决这个问题吗?

谢谢

【问题讨论】:

去掉itemToUpdate.SiteBrands = item.SelectedBrands ...或者改成itemToUpdate.SiteBrands = item.SelectedBrands;是否有效? 【参考方案1】:

问题是您没有为您的 SiteId 外键分配值,因此它将作为空值发送到数据库(您的数据库关系不允许)。尝试将您的代码更改为:

itemToUpdate.SiteBrands = item.SelectedBrands
                              .Select(br => new DataEntities.Siteconfig.SiteBrand
                                            
                                                SiteId = item.Id,
                                                BrandId = br
                                            ).ToList();

【讨论】:

以上是关于更新实体时出现异常“无法更改关系,因为一个或多个外键属性不可为空”的主要内容,如果未能解决你的问题,请参考以下文章

首先在实体框架数据库中级联删除

外键约束,带有子对象集合的 EF

无法删除用户外部登录

打印多对多实体时出现异常

保存一对多实体时出现神奇记录异常

将 AutoMapper 与实体框架一起使用时出现异常