代码优先模型在插入时不自动增加键
本文关键字:增加 插入 模型 代码 | 更新日期: 2023-09-27 18:11:05
我想我的模型有错误,但我不确定是什么。
首先是错误
The INSERT statement conflicted with the FOREIGN KEY constraint
"FK_dbo.ProjectDocAccess_dbo.ProjectDoc_ProjectDocAccessID". The conflict
occurred in database "dbname",
table "dbo.ProjectDoc", column 'ProjectDocID'.
ProjectDocAccess
模型(裁剪)
public class ProjectDocAccess
{
public int ProjectDocAccessID { get; set; }
public int ProjectDocID { get; set; }
public virtual ProjectDoc ProjectDoc { get; set; }
}
ProjectDoc
模型(裁剪)
public class ProjectDoc
{
public int ProjectDocID { get; set; }
public int ProjectID { get; set; }
public ProjectDocAccess ProjectDocAccess { get; set; }
public Project Project { get; set; }
}
流畅的API映射
modelBuilder.Entity<ProjectDocAccess>()
.HasRequired(p => p.ProjectDoc).WithOptional()
.WillCascadeOnDelete(true);
当我试图在ProjectDocAccess
表中插入一条新记录时,它迫使我在ProjectDocAccessID
字段中插入一个值。在我所有的其他模型中,这个auto是递增的。我不确定我做错了什么。帮助吗?
根据我选择的答案。这就是我所做的来修复它。
删除了流畅的API映射。
更新ProjectDocAccess
模型如下
public class ProjectDocAccess
{
[Key, ForeignKey("ProjectDoc")]
public int ProjectDocAccessID { get; set; }
public virtual ProjectDoc ProjectDoc { get; set; }
}
首先,当出现这样的问题时,您应该查看生成的迁移文件(或者如果没有这些文件,请启用它)—它会以"更高级别"的形式显示为您生成的表/映射。
问题是你有"一对一"的关系,你的ProjectDocAccess
到ProjectDoc
被映射为pk -> pk。在这些情况下,代码首先自动为您完成,因为这是唯一支持的制作one to one
的方法。
所以你的ProjectDocAccessID
总是映射== the same
作为你的ProjectDocID
。
ProjectDocID
是自动生成的-但您需要自己设置访问id以匹配它。(我猜这可能是自动化的,但严格来说,在数据库中它不是)。
它不能自动生成东西。它必须从
principal
复制表,其中'optional'为。
对于你当前的实体,它就是它-但是你可以重新安排事情(尽管一对一很难做到,如果你没有得到正确的结果可能会导致问题)。
有一个选项来创建one to one
只使用FK-s(这将允许你在你的'access'表上放置一个'独立的'主键)-但需要手动注入SQL CONSTRAINT
-例如,见这个页面- http://weblogs.asp.net/manavi/archive/2011/05/01/associations-in-ef-4-1-code-first-part-5-one-to-one-foreign-key-associations.aspx
如果你想要ProjectDocAccessID由数据库(一个标识列)生成,那么你应该用DatabaseGenerated
属性装饰该属性,像这样:
[DatabaseGenerated(DatabaseGenerationOption.Identity)]
public int ProjectDocAccessID { get; set; }
正如Andrei指出的,您可能还需要用[Key]
属性来装饰它。
来源:http://msdn.microsoft.com/en-US/data/jj591583