我认为我的模型中有错误,但我不确定它是什么。
首先是错误
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
字段中插入一个值。在我的所有其他型号中,此自动增量。我不确定我做错了什么。帮助
更新
根据我选择的答案。这就是我所做的修复它。
完全删除了流畅的API映射。
更新了ProjectDocAccess
模型,如下所示
public class ProjectDocAccess
{
[Key, ForeignKey("ProjectDoc")]
public int ProjectDocAccessID { get; set; }
public virtual ProjectDoc ProjectDoc { get; set; }
}
答案 0 :(得分:1)
首先,当遇到这样的问题时,你应该看看你生成的迁移文件(或者如果你没有启用它们) - 它会以一种“更高级别”的形式显示为你生成的表/映射。
问题是您有'一对一'的关系,而您的ProjectDocAccess
到ProjectDoc
与pk一起映射 - &gt; PK 即可。在这些情况下,代码首先自动为您执行此操作,因为这是制作one to one
的唯一受支持的方式。
因此,您的ProjectDocAccessID
始终被映射== the same
作为您的ProjectDocID
。
ProjectDocID
是自动生成的 - 但您需要将access-id设置为自己匹配。 (我猜这可能是自动化的,但严格来说在db术语中并非如此)。
所以,它不能自动生成东西。它必须从
principal
复制 表,'可选'是。
对于你当前的实体它就是这样 - 但你可以重新安排一些事情(虽然一对一很难做,如果你做不到就可能导致问题)。
可以选择仅使用FK-s创建one to one
(这将允许您在'access'表上放置'独立'主键) - 但需要手动注入SQL {{1} - 例如请参阅此页面 - 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
答案 1 :(得分:0)
如果您希望ProjectDocAccessID由数据库(Identity列)生成,那么您应该使用DatabaseGenerated
属性修饰该属性,如下所示:
[DatabaseGenerated(DatabaseGenerationOption.Identity)]
public int ProjectDocAccessID { get; set; }
正如Andrei指出的那样,您可能还需要使用[Key]
属性来装饰它。