【问题标题】:Changing the foreign key: Cannot insert the value NULL into column更改外键:无法将值 NULL 插入列
【发布时间】:2015-02-28 21:19:20
【问题描述】:

我的 EF 数据库中有一些数据。我想更改我的一个类中的外键:

[ForeignKey("Collection")]
public int CollectionID { get; set; }

很遗憾我收到了这个错误

无法将值 NULL 插入到列“CollectionID”、表“WebLanguageTeacher1.dbo.Words”中;列不允许空值。更新失败。

当我尝试向我的数据库添加新迁移时。这是可以理解的:foregin key 不能为空,当我在我的数据库中创建新列时,实体框架会创建新的 NULL 单元格。

问题是:我应该怎么做才能绕过它?尽管如此,我如何添加新的外键?

【问题讨论】:

  • 当您在 edmx 中更改它时,您是否更新/刷新了实体..?如果我正确理解您的问题,请告诉我
  • 我使用 EF Code First 所以我直接在代码中修改模型,而不是在 edmx 文件中

标签: c# asp.net-mvc entity-framework entity-framework-migrations


【解决方案1】:

我以前也遇到过类似的情况,尽管在我的情况下它是主键。

我通过编辑迁移脚本绕过了这一点。

【讨论】:

  • 你到底做了什么改变?
【解决方案2】:

这实际上不是实体框架代码优先问题,而是数据库问题。

如果您尝试将列添加到表中,然后将外键约束与主键表一起添加,您将得到相同的错误。

原因是您创建的列将 null 作为每个现有记录的默认值。然后,在应用约束时,您将尝试将 null 与父表的主键相关联。

因此,解决方案是以下几种选择之一:

如果不需要当前数据(应用程序的初始开发),则清除数据 - 这将允许创建关系,并且只会在添加数据时生效。

为父表中已有值的新列设置默认值,这样就不会有记录找不到父键值。因此,如果您知道父表中始终存在值“1”,则可以使用“1”作为默认值(仅作为临时解决方案 - 将在实时应用程序的未来允许无效数据)。

创建没有关系的列,用相关值填充列,然后添加约束。

【讨论】:

  • 我无法删除这些数据。我使用了 DeafaultValue 属性,但我仍然收到此错误。如果不是这个属性,我应该用什么来设置默认值?
  • 您需要两个迁移步骤:1) 添加一个没有引用约束的新列,并为所有现有记录设置其适当的值(即,如果稍后添加 FK 约束,该值将有效)作为一部分您的迁移脚本 2) 添加 FK 约束。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-27
  • 2021-10-31
  • 2012-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多