无法将值NULL插入“MaintenanceId”列,表'<tablename>';列不允许空值。 INSERT未通过EF 6.1

时间:2016-03-30 04:54:31

标签: c# sql-server entity-framework azure

所以我想尝试在azure上添加一个简单的数据库,但由于某种原因,数据库没有为该条目生成我的PK。
下面是用于创建数据库并执行输入的所有代码 这是在控制台应用程序上的EF 6.1上

上下文

public BlizzardDbContext() : base("AzureSqlDb")
{
}

public DbSet<Maintenance> Maintenances { get; set; }

模型

public class Maintenance
{
    public Maintenance()
    {}

    public Maintenance(DateTime start, DateTime end, string info)
    {
        Start = start;
        End = end;
        Info = info;
    }

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int MaintenanceId { get; set; }

    public DateTime? Start { get; set; }

    public DateTime? End { get; set; }

    public string Info { get; set; }
}

测试保存更改失败

var context = new BlizzardDbContext();
context.Maintenances.Add(new Maintenance() {Start = DateTime.Now, End = DateTime.Now, Info = ""});
context.SaveChanges();

我知道这听起来很简单,我以前曾经使用EF几次,但是这次无法弄清楚出了什么问题 这是错误

  

“无法将值NULL插入列'MaintenanceId',表'.dbo.Maintenances';列不允许空值.INSERT失败。\ r \ n语句已终止。”

enter image description here

更新:通过删除数据库并重新创建它来结束修复,我认为EF有一些奇怪的事情,它没有正确地更新数据库,因为在重新创建它之后,该列被设置为身份

2 个答案:

答案 0 :(得分:2)

只需验证MaintenanceId是否为DB中的身份密钥。 如果不是,或者您不确定可以尝试以下选项

更改

 [DatabaseGenerated(DatabaseGeneratedOption.Identity)]

[DatabaseGenerated(DatabaseGeneratedOption.None)]

.None - 这意味着“数据库不会生成值。”

答案 1 :(得分:0)

登录到您的数据库并验证MaintenanceId确实是自动生成密钥。 EF supports this,我怀疑在迁移过程中发生了一些有趣的事情,如果您使用过,或者在构建表格时。

此外,请确保您没有禁用DbContext类中对象的跟踪。它是默认设置,因此除非您明确禁用它,否则您不必担心它:)