C# EF6&x2B;代码优先+;Fluent:错误无法将值NULL插入列';ID';,表';X';列不允许空值
有很多问题提到了这个错误,我检查了每一个我发现的问题,但是它们与我的问题不一致。在我发现的问题中,大多数情况下,问题是作者愿意手动为实体提供ID,但忘记将“自动生成”选项切换为“关闭” 我的问题恰恰相反。我有几个表都包含一个ID列,该列由数据库自动递增。除一个外,所有的积垢处理都很好 我得到了标题中提到的可怕的例外。我花了两个小时在这上面,但我不知道为什么。一切似乎都很好 这是我的模型:C# EF6&x2B;代码优先+;Fluent:错误无法将值NULL插入列';ID';,表';X';列不允许空值,c#,entity-framework,fluent,C#,Entity Framework,Fluent,有很多问题提到了这个错误,我检查了每一个我发现的问题,但是它们与我的问题不一致。在我发现的问题中,大多数情况下,问题是作者愿意手动为实体提供ID,但忘记将“自动生成”选项切换为“关闭” 我的问题恰恰相反。我有几个表都包含一个ID列,该列由数据库自动递增。除一个外,所有的积垢处理都很好 我得到了标题中提到的可怕的例外。我花了两个小时在这上面,但我不知道为什么。一切似乎都很好 这是我的模型: public class House { public int ID { get; set; }
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);
这对我来说毫无意义,我已经尝试过调试,当我的代码点击上下文的Save方法时,本地缓存包含我使用正确参数创建的实体,但它会抛出以下错误:
错误:无法将值NULL插入列“ID”,表“Houses”列不允许为NULL
作为提醒,我不需要/不想自己设置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);
您的数据库是如何创建的?您确定该列已在服务器上设置为标识吗
如果没有,请尝试删除数据库并重新运行应用程序。您的数据库是如何创建的?是否确实在服务器上将列设置为identity?首先使用代码自动创建数据库。我不太确定,我将在问题中添加表模式。我不是DB专家,我很难解释其中的某些部分。我没有在您的
创建表脚本中看到ID上的标识。那么我应该如何添加它呢?EF为我创建了整个脚本=/好吧,完成了lol VS使它变得简单。我再试一次,我会回到你身边。但是手动编辑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);