所以我想尝试在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语句已终止。”
更新:通过删除数据库并重新创建它来结束修复,我认为EF有一些奇怪的事情,它没有正确地更新数据库,因为在重新创建它之后,该列被设置为身份
答案 0 :(得分:2)
只需验证MaintenanceId是否为DB中的身份密钥。 如果不是,或者您不确定可以尝试以下选项
更改
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
到
[DatabaseGenerated(DatabaseGeneratedOption.None)]
.None - 这意味着“数据库不会生成值。”
答案 1 :(得分:0)
登录到您的数据库并验证MaintenanceId确实是自动生成密钥。 EF supports this,我怀疑在迁移过程中发生了一些有趣的事情,如果您使用过,或者在构建表格时。
此外,请确保您没有禁用DbContext类中对象的跟踪。它是默认设置,因此除非您明确禁用它,否则您不必担心它:)