代码优先模型在插入时不自动增加键

本文关键字:增加 插入 模型 代码 | 更新日期: 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; }
 }

代码优先模型在插入时不自动增加键

首先,当出现这样的问题时,您应该查看生成的迁移文件(或者如果没有这些文件,请启用它)—它会以"更高级别"的形式显示为您生成的表/映射。

问题是你有"一对一"的关系,你的ProjectDocAccessProjectDoc被映射为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