有很多问题提到这个错误,我经历了我找到的每一个,但它们与我的问题不符。在我发现的问题中,大多数情况下,问题来自于作者愿意手动为实体提供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);
答案 0 :(得分:1)
您的数据库是如何创建的?你确定该列在服务器上设置为identity吗?
如果没有尝试删除数据库并重新运行您的应用程序。