EF代码第一个PK列 - 无法将值NULL插入列/ INSERT语句与FOREIGN KEY约束

时间:2017-05-24 09:30:48

标签: c# sql-server entity-framework

我正在努力解决我的两个实体之间的关系。它应该是1对1的关系,其中文件可能包含也可能不包含OcrTask。

以下是实体(我删除了大部分不相关的属性)

 public class RepositoryFile 
    {
        public string FileName { get; set; }
        public int RepositoryFileId { get; set; }
        public int ProjectId { get; set; }
        public virtual Project Project { get; set; }
        public int? OcrTaskId { get; set; }
        public virtual OcrTask OcrTask { get; set; }
    }

这是依赖实体:

public class OcrTask
{
    private OcrTask()
    {
    }
    public OcrTask(int repositoryFileId)
    {
        this.RepositoryFileId = repositoryFileId;
    }
    [JsonProperty]
    public int OcrTaskId { get; internal set; }
    public int RepositoryFileId { get; set; }
    public virtual RepositoryFile RepositoryFile { get; set; }
    public int ProjectId { get; set; }
    public virtual Project Project { get; set; }
}

并且,为了清楚起见,项目(可能包含零个或多个文件,因此包含零个或多个OcrTasks - 但每个任务和文件必须与项目相关联)

public class Project
    {
        internal Project()
        {
        }
        public Project(string projectName)
        {
            this.ProjectName = projectName;
        }
        public string ProjectName { get; set; }
        [JsonProperty]
        public int ProjectId { get; internal set; }
        public virtual ICollection<OcrTask> OcrTasks { get; set; } = new HashSet<OcrTask>();
        public virtual ICollection<RepositoryFile> RepositoryFiles { get; set; } = new HashSet<RepositoryFile>();
    }

现在,我遇到的问题是,当我尝试使用EntityFramework在OcrTasks表中插入一个条目时,我收到一个错误The INSERT statement conflicted with the FOREIGN KEY constraint \"FK_dbo.OcrTasks_dbo.Projects_ProjectId\". The conflict occurred in database \"TheDatabase\", table \"dbo.Projects\"

当我去数据库尝试从SQL studio插入时,错误显示Cannot insert the value NULL into column 'OcrTaskId', table 'ConHubTestDb.dbo.OcrTasks'; column does not allow nulls. INSERT fails.

我运行的SQL是(文件ID为4,项目ID 5已存在于DB中)

insert into OcrTasks(CreatedDate, RepositoryFileId, ProjectId)
VALUES (GETUTCDATE(),4,5)

我不明白为什么标识列没有正常分配值 - 所有其他实体都这样做了?

此外,这是EF生成的列。当我检查OcrTaskId列的属性时,我看到Identity被设置为False。为什么呢?

enter image description here

另外,我有一个流畅的API片段。没有它,我得到一个错误,无法确定哪个是文件和任务实体之间关系的依赖端。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<RepositoryFile>().HasOptional(f => f.OcrTask).WithRequired(t => t.RepositoryFile);
            base.OnModelCreating(modelBuilder);
        }

提前致谢!

1 个答案:

答案 0 :(得分:0)

你的部分问题是OcrTaskId列的Indentity设置为false。 你应该将它设置为true,这样你就可以自动增量。然后你插入不好的工作。

关于FOREIGN KEY的错误,您可以将代码发布到实体插入的位置吗?