0

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

首先是错误

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

2 回答 2

1

首先,当出现此类问题时,您应该查看生成的迁移文件(或者如果您没有它们,只需启用它) - 它以“更高级别”的形式显示为您生成的表/映射。

问题是您具有“一对一”关系,并且您的ProjectDocAccesstoProjectDoc与 pk -> pk 映射。在这些情况下,代码优先会自动为您执行此操作,因为这是制作one to one.

因此,您ProjectDocAccessID始终将 == 映射the same为您的ProjectDocID.

是自动生成的ProjectDocID- 但您需要自己放置访问 ID 以匹配它。(我猜这可能是自动化的,但严格来说,它不是)。

所以,它不能自动生成东西。它必须从principal “可选”所在的表中复制。

对于您当前的实体,它就是这样 - 但您可能会重新安排事情(尽管一对一很难做到,如果您做错了可能会导致问题)。

有一个one to one仅使用 FK-s 创建的选项(这将允许您在“访问”表上放置一个“独立”主键) - 但需要手动注入 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

于 2013-04-27T20:29:35.697 回答
0

如果您希望 ProjectDocAccessID 由数据库(一个 Identity 列)生成,那么您应该使用该属性装饰该DatabaseGenerated属性,如下所示:

[DatabaseGenerated(DatabaseGenerationOption.Identity)]
public int ProjectDocAccessID { get; set; }

正如 Andrei 指出的那样,您可能还需要使用[Key]属性来装饰它。

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

于 2013-04-27T20:32:02.890 回答