错误:无法添加实体类型'JobAccessLevel'的种子实体,因为没有为所需属性'PersonId'

时间:2019-10-10 10:35:43

标签: c# entity-framework-core

我遇到以下错误:

  

无法添加实体类型“ JobAccessLevel”的种子实体,因为没有为必需的属性“ PersonId”提供值。

这似乎是由于尝试使用PersonId = null播种数据库引起的。 (但这正是我想要做的)

如何解决此问题?

我的问题的背景:

让我们想象一下,我想基于PersonId和persons作业来保护某些东西,但是我想拥有针对特定Job的通用Access杠杆,但是对于给定作业中Person的特定Access级别。

为控制这一点,我创建了以下要存储在数据库中的实体:

public class JobAccessLevel
{
    public int JobId { get; set; }
    public int? PersonId { get; set; }
    public int AccessLevelId { get; set; }
    public AccessLevel AccessLevel { get; set; }
}

因此,当PersonId为null时,我仍然可以使用访问级别。

用于在数据库中创建此实体的配置文件如下:

public void Configure(EntityTypeBuilder<JobAccessLevel> builder)
{
    builder.Property(JobAccessLevel=> JobAccessLevel.JobId ).ValueGeneratedNever();
    builder.Property(JobAccessLevel=> JobAccessLevel.PersonId ).ValueGeneratedNever();

    builder.HasKey(JobAccessLevel=> new { JobAccessLevel.JobId , JobAccessLevel.PersonId });


    builder.HasData(new List<JobAccessLevel>
    {
        new JobAccessLevel
        {
            JobId = 1,
            AccessLevel= 2,
            PersonId = null
        },
        new JobAccessLevel
        {
            JobId = 2,
            AccessLevel= 1,
            PersonId = null
        },
        new JobAccessLevel
        {
            JobId = 2,
            AccessLevel= 2,
            PersonId = 3
        }
    });
}

p.s:尝试创建新迁移时出现此错误

1 个答案:

答案 0 :(得分:1)

这是因为您将键定义为JobIdPersonId的复合键,因此两者都必须具有值。另请参阅:

您可能希望实体具有自己的ID:

public class JobAccessLevel
{
    public int Id { get; set; }
    // ...
}

然后:

builder.HasKey(a => new { a.Id });

然后您还必须提供种子数据:

builder.HasData(new List<JobAccessLevel>
{
    new JobAccessLevel
    {
        Id = 1,
        JobId = 1,
        AccessLevel= 2,
        PersonId = null
    },
    // ...