我在实体框架中看到了一个奇怪的行为。我正在使用代码优先方法来定义两个实体之间的一对多关系:
public class IncomingCheck : AuditedEntityBase
{
[Key]
public int Id { get; set; }
[Required]
public virtual CheckType Type { get; set; }
[Required]
public virtual Bank Bank { get; set; }
public string Branch { get; set; }
public virtual IList<IncomingCheckHistory> History { get; set; }
}
public class IncomingCheckHistory
{
[Key]
public int Id { get; set; }
public string LongDescription { get; set; }
}
而这里是我,我正在尝试添加一个项目到History
:
using (var db = new CheckDataContext())
{
foreach (var check in SelectedItems)
{
var dbCheck = await db.IncomingChecks.FindAsync(check.Id);
var history = new IncomingCheckHistory()
{
LongDescription = "something",
};
dbCheck.History.Add(history);
await db.SaveChangesAsync(); //throws the exception
}
}
但它抛出一个异常,说“不能将值NULL插入列'Id'”。但是我总是像这样做。该数据库应该用唯一的数字填充Id
列本身。
我错过了什么?
使用SSProfiler,我得到了在数据库上运行的查询。它如下:
exec sp_executesql N'INSERT [dbo].[IncomingCheckHistories]([LongDescription], [IncomingCheck_Id])
VALUES (@0, @1)
SELECT [Id]
FROM [dbo].[IncomingCheckHistories]
WHERE @@ROWCOUNT > 0 AND [Id] = scope_identity()',N'@0 nvarchar(max) ,@1 int',@0=N'Something',@1=1
请注意,scope_identity()
应该获得Id本身,对吗?
不应该将Id设置为身份吗?像这样:
public class IncomingCheckHistory
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[Key]
public string LongDescription { get; set; }
}
希望这是您问题的解决方案!
好吧,出于一些奇怪的原因,确切的代码在完全删除数据库和迁移并从头开始之后仍然有效。我不确定为什么没有迁移就行不通。此外,我曾尝试删除数据库,但当时我尝试了一些不同的代码。
在任何情况下,发布的代码/查询都应该有效。我还检查了数据库和列,看看是否有什么不同,但事实并非如此。如果有人能够解释为什么它不起作用而现在就是这样,我将不胜感激。