首先使用代码,一切似乎都与下面的工作不同,在我使用ObjectContext并调用context.PCBuilds.AddObject(pcBuild)之前,以下代码也可以工作,但是切换到DbContext后,它给了我错误。
EFDbContext context = new EFDbContext();
public ActionResult Index()
{
PCBuild pcBuild = new PCBuild();
pcBuild.BuildID = 34245;
pcBuild.BuildName = "Test99";
pcBuild.MarkUp = 25;
pcBuild.BDetails = new List<BDetail>();
context.PCBuilds.Add(pcBuild);
//repository.PCBuilds.Attach(pcBuild);
context.SaveChanges();
return View();
}
给我:
Cannot insert the value NULL into column 'BuildID', table 'C:\USERS\ADMIN\DOCUMENTS\VISUAL STUDIO 2010\PROJECTS\NEOCART\NEOCART.WEBUI\APP_DATA\NEODBX.MDF.dbo.PCBuilds'; column does not allow nulls. INSERT fails.
在调用SaveChanges之前,已明确设置BuildID。似乎由于某种原因,调用.Add(pcBuild)不会添加填充的对象,并且在调用savechanges时,它将尝试插入空的PCBuild吗?这是POCO的
public class PCBuild
{
[Key]
public int BuildID { get; set; }
public string BuildName { get; set; }
public string Socket { get; set; }
public decimal? MarkUp {get; set;}
[InverseProperty("PCBuild")]
public virtual ICollection<BDetail> BDetails { get; set; }
}
public class BDetail
{
[Key]
public int LineID { get; set; }
[ForeignKey("PCBuild")]
public int BuildID { get; set; }
[ForeignKey("Product")]
public int ProductID { get; set; }
public bool? IsSelected { get; set; }
[InverseProperty("BDetails")]
public virtual PCBuild PCBuild { get; set; }
[InverseProperty("BDetails")]
public virtual Product Product { get; set; }
}
最佳答案
在PCBuild.BuildID
属性上使用StoreGeneratedAttribute。它不仅是键,而且是IDENTITY
字段。
更新
Actually,应为[DatabaseGenerated(DatabaseGenerationOption.Identity)]
批注。上面链接的文章介绍了早期的CTP版本。
更新2
等等,密钥是由应用程序生成的,它不是数据库中的标识列吗?将注释更改为[DatabaseGenerated(DatabaseGenerationOption.None)]
,重新创建上下文并重建应用程序。