Ошибка: Невозможно добавить начальный объект для типа объекта «JobAccessLevel», поскольку не было предоставлено значение для обязательного свойства «PersonId» - PullRequest
0 голосов
/ 10 октября 2019

Я получаю следующую ошибку:

Невозможно добавить начальную сущность для типа сущности 'JobAccessLevel', поскольку для обязательного свойства PersonId не было предоставлено значение.

И, похоже, это вызвано попыткой заполнить базу данных PersonId = null. (но это именно то, что я хочу сделать)

Как я могу решить эту проблему?

Контекст моей проблемы:

Давайте представим, что яЯ хочу, чтобы что-то было защищено на основе PersonId и работы лиц, но я хочу иметь общий рычаг доступа для определенной работы, но определенные уровни доступа для человека в данной работе.

Для управления этим ясоздал следующую сущность для хранения в базе данных:

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

пс: я получаю эту ошибку при попытке создать новую миграцию

1 Ответ

1 голос
/ 10 октября 2019

Это потому, что вы определяете ключ как составной ключ JobId и PersonId, для которого оба значения должны иметь значение. См. Также:

Возможно, вы хотите, чтобы у сущности был собственный идентификатор:

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
    },
    // ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...