【问题标题】:Entity Framework - Cannot insert the value NULL into column?实体框架 - 无法将值 NULL 插入列?
【发布时间】:2018-02-16 15:33:36
【问题描述】:

我已经查看了有关此主题的所有类似问题,但似乎没有一个对我有用。当我尝试运行这两个命令时,我不知道为什么会出现以下错误:add-migration,然后是update-database

无法将值 NULL 插入表的“StudentId”列 'aspnet-JavaWebsiteProject-20171006053028.dbo.Groups';列不 允许空值。更新失败。该语句已终止。

我正在使用Entity Framework v6.2.0。我在下面有三个简单的模型:

public class Student
{
    public int Id { get; set; }

    public string UserId { get; set; }

    [EmailAddress]
    public string Email { get; set; }
}

教师模型:

public class Teacher
{
        public int Id { get; set; }

        public string UserId { get; set; }

        [EmailAddress]
        public string Email { get; set; }
    }

//组模型:

public class Group
{
    public int Id { get; set; }

    [Required]
    public int StudentId { get; set; }
    public Student Student { get; set; }

    [Required]
    public int TeacherId { get; set; }
    public Teacher Teacher { get; set; }
} 

谁能指导我可能做错了什么或如何解决此错误?

谢谢

【问题讨论】:

  • 是初始迁移还是您的数据库中已有表?
  • 这是初始迁移 - 第一次迁移
  • 尝试转储数据库并运行:Add-Migration InitialCreate –IgnoreChanges
  • 我已经有一段时间没有使用迁移了,所以我忘记了确切的机制,但是您的迁移是否在数据库中创建了初始种子数据?如果是这样,是否为 Groups 表完全定义了该数据?
  • @StefanW。如果我在尝试更改现有列的数据类型时遇到此错误,您知道问题可能是什么吗?

标签: c# visual-studio entity-framework-6


【解决方案1】:

如果您希望该列可以为空,您应该将模型的属性设置为可以为空的类型。

public int? StudentId { get; set; }

在此之后,您将不得不再次创建并运行迁移。

【讨论】:

    【解决方案2】:

    与@StefanW. 的评论相关,如果 Groups 表已经存在并且您正在向其中添加 StudentId(和其他)列,如果存在现有行,那么这些行将必须具有某些值为每个新列指定。如果您没有为该列指定默认值,那么数据库将尝试使用NULL,这将失败,因为该列不允许空值。

    【讨论】:

      【解决方案3】:

      这个问题已经存在多年了。关于它的话题有几十个。在大多数主题中,答案是“将 IsIdentity=true 并指定 Identity start 和 step in the table design”,或者将您的身份定义放在 SQL 中,

       CREATE TABLE ..
           [id] INT IDENTITY(1,1) NOT NULL
           ...
      

      喜欢

      Cannot insert the value NULL into column 'Id', Entity framework

      .. 对于大约 75% 的会员来说,这个答案会立即生效!但是.. 对于 25% 的人来说,这似乎不是解决方案。有一些主题得到了公认的答案,建议重新创建使用迁移命令(edmx 上下文)涉及的表,

      Entity Framework Cannot insert the value NULL into column Identity Specification set to No

      .. 但我不想重新创建我珍贵的桌子,所以这个过程是没有选择的。今天我在这里解决了, 不必重置任何表格。原因非常微不足道。我的连接字符串没有寻址数据库,所以我实际上在同一服务器上的 another 数据库中搭建了我的表,其中 IDENTITY[1,1] 未在 Table create 中设置!当然,在调试时我只检查了我自己的数据库:),它设置正确。但是表格设计中的措施没有效果。当然不是。。我编辑错了数据库!

      为了解决这个问题,我将连接字符串更改为包含初始目录,来自

       <add name="MyDBContext"  connectionString="Data Source=..;Persist Security Info=True;User ID=..;Password=.."  providerName="System.Data.SqlClient" />
      

       <add name="MyDBContext"  connectionString="Data Source=..;Persist Security Info=True;initial catalog=MyDatabase;User ID=..;Password=.."  providerName="System.Data.SqlClient" />
      

      还有一个问题。为什么微软不要求我们在 app.config 中为 Framework 6 连接字符串设置初始目录?上面的过程可能在没有通知的情况下破坏了现有的other数据库..

      【讨论】:

        猜你喜欢
        • 2016-07-05
        • 1970-01-01
        • 2011-05-25
        • 1970-01-01
        • 2015-10-18
        • 2012-09-25
        • 2017-03-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多