更新实体时出现异常“无法更改关系,因为一个或多个外键属性不可为空”
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();
【讨论】:
以上是关于更新实体时出现异常“无法更改关系,因为一个或多个外键属性不可为空”的主要内容,如果未能解决你的问题,请参考以下文章