我在实体框架中看到了一个奇怪的行为。我正在使用代码优先方法来定义两个实体之间的一对多关系:
nrow()
这就是我在尝试将项目添加到aDataTable[(nrow(theData)-4):nrow(theData),1:3]
:
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; }
}
但它抛出一个异常,说“不能将值NULL插入列'Id'”。但是我总是像这样做。数据库应该使用唯一编号填充History
列本身。
我错过了什么?
使用SSProfiler,我得到了在数据库上运行的查询。它如下:
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
}
}
请注意Id
应该获取ID本身,对吗?
答案 0 :(得分:0)
不应将Id设置为标识吗? 像这样:
public class IncomingCheckHistory
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[Key]
public string LongDescription { get; set; }
}
希望这是您问题的解决方案!
答案 1 :(得分:0)
出于某种奇怪的原因,确切的代码在完全删除数据库和迁移并从头开始之后仍然有效。我不确定为什么没有迁移就行不通。此外,我曾尝试删除数据库,但当时我尝试了一些不同的代码。
在任何情况下,发布的代码/查询都应该有效。我还检查了数据库和列,看看是否有什么不同,但事实并非如此。如果有人能够解释为什么它不起作用而现在就是这样,我将不胜感激。