【发布时间】:2014-08-26 19:38:57
【问题描述】:
我使用的是 EF Code First,并且有一个没有名为 Id 的键的表。对于此表,将密钥命名为 SelectorId 是有意义的。问题是当我添加新行时出现错误:
无法将值 NULL 插入到表的“SelectorId”列中 'dbProgramData.dbo.Selectors';列不允许空值。 插入失败。该语句已终止。
当然它不允许空值 - 它是该表的主键,但我假设该键是自动递增的。我有这样定义的模型:
public class Selector
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int SelectorId { get; set; }
public string ProgramId { get; set; }
....
}
我正在尝试使用此代码添加一行(在我的本地 PC 上使用 VS 可以正常工作,但在发布后在远程 VPS 上失败并出现上述错误:
ProgramDbContext dbProgramData = new ProgramDbContext();
Selector selector = new Selector();
selector.ProgramId = programId;
dbProgramData.Selectors.Add(selector)
dbProgramData.SaveChanges();
在我的 ProgramDbContext 类中:
public DbSet<Selector> Selectors { get; set; }
如果我将SelectorId 重命名为Id,我怀疑这个问题会解决吗?运行 Add Migration 后,up/down 脚本显示:
CreateTable(
"dbo.Selectors",
c => new
{
SelectorId = c.Int(nullable: false, identity: true),
ProgramId = c.String(),
....
谁能告诉我我做错了什么?我创建的两个表也有同样的问题,它们都有一个名为 Id 以外的 Pk。
更新
按照建议,我进入远程服务器上此表的 SSMS 和设计视图。我看到Is Identity 设置为否。我仔细检查了我的本地数据库表,Is Identity 设置为是,因为它应该是。
我将数据库表发送到远程 VPS 服务器的方法是使用 SSMS,方法是右键单击数据库,然后在任务 -> 导入数据上。我指向我的本地 .\SQLEXPRESS 并执行导入。似乎导入成功,但显然没有。在执行导入之前,我将删除远程数据库中的所有表。
这种方法不应该在导入数据的同时创建确切的架构吗?
【问题讨论】:
-
我不太了解 EF,但是如果它是自动增量的,为什么要设置
SelectorId?如果你不设置它,EF不会自动将它设置为下一个值(这就是Identity应该做的,对吧)? -
我没有设置它。我认为它应该完全按照您所说的那样工作 - EF/SQL 将自动递增,但是当我尝试添加一行时,我收到一个错误,即 SelectorId 不能为空。 :S
-
但是,例如,您要添加哪一行?
-
@NickyvV,我的问题的第三个代码块中有一个示例。
标签: sql-server entity-framework