代码第一个模型不插入时自动递增键

时间:2013-04-27 20:17:09

标签: c# ef-code-first fluent-interface

我认为我的模型中有错误,但我不确定它是什么。

首先是错误

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; }
 }

2 个答案:

答案 0 :(得分:1)

首先,当遇到这样的问题时,你应该看看你生成的迁移文件(或者如果你没有启用它们) - 它会以一种“更高级别”的形式显示为你生成的表/映射。

问题是您有'一对一'的关系,而您的ProjectDocAccessProjectDoc与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]属性来装饰它。

来源:http://msdn.microsoft.com/en-US/data/jj591583