EF6 + Code First + Fluent:错误无法将值NULL插入列'ID',表'X'列不允许空值

时间:2014-06-24 13:35:42

标签: c# entity-framework fluent

有很多问题提到这个错误,我经历了我找到的每一个,但它们与我的问题不符。在我发现的问题中,大多数情况下,问题来自于作者愿意手动为实体提供ID,但忘记将自动生成选项切换为关闭。

我的问题恰恰相反。我有几个表都包含一个ID列,该列由数据库自动递增。 CRUDs操作在所有这些操作上运行良好但只有一个。

我遇到了标题中提到的可怕异常。我已经花了2个小时,但我无法弄明白为什么。一切似乎都很好。

这是我的模特:

public class House
{
    public int ID { get; set; }
    public string Name {get;set;}
    public DateTime CreationDate { get; set; }

    public int CompanyID { get; set; }
    public virtual BuildingCompany Assignation { get; set; }
    public int? NoteID { get; set; }
    public Note Note { get; set; }
    public int UserID { get; set; }
    public virtual User User { get; set; }
    public int? FileID { get; set; }
    public virtual File File { get; set; }
}

这是映射代码

modelBuilder.Entity<House>().HasKey(r => r.ID);
modelBuilder.Entity<House>().Property(r => r.ID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
modelBuilder.Entity<House>().HasRequired(r => r.Company).WithMany(a => a.Houses).HasForeignKey(r => r.CompanyID).WillCascadeOnDelete(false); 
modelBuilder.Entity<House>().HasOptional(r => r.File).WithMany().HasForeignKey(r => r.FileID);
modelBuilder.Entity<House>().HasRequired(r => r.User).WithMany().HasForeignKey(r => r.UserID);
modelBuilder.Entity<House>().HasOptional(r => r.Note).WithRequired(n => n.House);

以下是我用来尝试持久保存实体的代码(添加一行):

House house = new House
            {
                ID=0, // I also tried to remove this line
                Name="Nice House",
                CompanyID= // Some Integer,
                CreationDate=DateTime.Now,
                UserID= // Some Integer
            };

context.Houses.Add(house)
context.Save();

这对我来说没有意义,我已经尝试调试,当我的代码点击我的上下文的Save方法时,Local缓存包含我用正确的参数创建的实体但是它然后它抛出了这个错误:

  

错误无法将值NULL插入列'ID',表'Houses'列不允许空值。

提醒一下,我不需要/想要自己设置ID。我期待EF为我做这件事,就像我对其他桌子一样。这就是为什么这个问题特别困扰我。

感谢您的帮助

修改

这是数据库架构。数据库由EF自动生成。我只在每次模型更改后进行自动迁移。我没有触及这个细节层次。

CREATE TABLE [dbo].[Houses] (
    [ID]            INT            NOT NULL,
    [Name]  NVARCHAR (MAX) NULL,
    [CreationDate]     DATETIME       NOT NULL,
    [CompanyID] INT            NOT NULL,
    [NoteID]        INT            NULL,
    [UserID] INT            NOT NULL,
    [FileID]     INT            NULL,
    CONSTRAINT [PK_dbo.Houses] PRIMARY KEY CLUSTERED ([ID] ASC),
    CONSTRAINT [FK_dbo.Houses_dbo.Files_FileID] FOREIGN KEY ([FileID]) REFERENCES [dbo].[Files] ([ID]),
    CONSTRAINT [FK_dbo.Houses_dbo.Users_UserID] FOREIGN KEY ([UserID]) REFERENCES [dbo].[Users] ([ID]) ON DELETE CASCADE,
    CONSTRAINT [FK_dbo.Houses_dbo.BuildingCompanies_CompaniesID] FOREIGN KEY ([CompanyID]) REFERENCES [dbo].[BuildingCompanies] ([ID])
);


GO
CREATE NONCLUSTERED INDEX [IX_CompanyID]
    ON [dbo].[Houses]([CompanyID] ASC);


GO
CREATE NONCLUSTERED INDEX [IX_UserID]
    ON [dbo].[Houses]([UserID] ASC);


GO
CREATE NONCLUSTERED INDEX [IX_FileID]
    ON [dbo].[Houses]([FileID] ASC);

1 个答案:

答案 0 :(得分:1)

您的数据库是如何创建的?你确定该列在服务器上设置为identity吗?

如果没有尝试删除数据库并重新运行您的应用程序。