Невозможно вставить значение NULL в сообщение об ошибке столбца - PullRequest
0 голосов
/ 02 июня 2019

Я пытаюсь запустить миграцию.Миграция проходит, однако, когда я пытаюсь обновить базу данных, я получаю это сообщение об ошибке

Невозможно вставить значение NULL в столбец scheduleDateAndTimeid, таблица aspnet-ScheduleWebApp-20190525082521.dbo.Students«;столбец не допускает пустых значений.ОБНОВЛЕНИЕ не удается.

У меня есть два класса моделей, один из которых называется student, а другой - scheduleDateAndTime.

Я создал DTO с отображением на модель student и добавил свойство навигации в scheduleDateAndTime

Миграция

public partial class AnotherMigrationTwoTWOTwotwo : DbMigration
{
    public override void Up()
    {
        DropForeignKey("dbo.Students", "scheduleDateAndTime_id", "dbo.ScheduleDateAndTimes");
        DropIndex("dbo.Students", new[] { "scheduleDateAndTime_id" });
        RenameColumn(table: "dbo.Students", name: "scheduleDateAndTime_id", newName: "scheduleDateAndTimeid");
        AlterColumn("dbo.Students", "scheduleDateAndTimeid", c => c.Int(nullable: false));
        CreateIndex("dbo.Students", "scheduleDateAndTimeid");
        AddForeignKey("dbo.Students", "scheduleDateAndTimeid", "dbo.ScheduleDateAndTimes", "id", cascadeDelete: true);
    }

    public override void Down()
    {
        DropForeignKey("dbo.Students", "scheduleDateAndTimeid", "dbo.ScheduleDateAndTimes");
        DropIndex("dbo.Students", new[] { "scheduleDateAndTimeid" });
        AlterColumn("dbo.Students", "scheduleDateAndTimeid", c => c.Int());
        RenameColumn(table: "dbo.Students", name: "scheduleDateAndTimeid", newName: "scheduleDateAndTime_id");
        CreateIndex("dbo.Students", "scheduleDateAndTime_id");
        AddForeignKey("dbo.Students", "scheduleDateAndTime_id", "dbo.ScheduleDateAndTimes", "id");
    }
}

StudentDto класс модели:

public class StudentDto
{
    public int id { get; set; }
    public string name { get; set; }
    public byte age { get; set; }
    public string subjectStudying { get; set; }
    public string disability { get; set; }
    public string additionalInformation { get; set; }
    public ScheduleDateAndTimeDto ScheduleDateAndTime { get; set; }
    public int scheduleDateAndTimeid { get; set; }
}

Ответы [ 3 ]

0 голосов
/ 03 июня 2019

Вы пытаетесь обновить таблицу, превращая обнуляемый внешний ключ в необнуляемый внешний ключ : если вы работаете с пустой таблицей (без записей), эта операция будет работать нормально, но если существуют существующие записи, миграция может встретиться со значениями NULL в этих записях для этого столбца (который был действительным значением ДО миграции) .

Это может звучать как ограничение, но имеет абсолютно смысл: Если вы обновляете столбец, чтобы он не обнулялся, как миграция должна работать с существующими данными? (подумайте о производственной среде релизы и т.д ..)

Обходной путь может заключаться в том, чтобы сначала оставить столбец обнуляемым, затем обновить все значения NULL для существующих записей, а затем сделать его необнуляемым.

0 голосов
/ 03 июня 2019

Вместо того, чтобы загружать вашу базу данных для вставки неверных данных или нарушения ссылочной целостности, поступайте правильно и нормализуйте свои данные:

CREATE TABLE StudentSchedule (
    studentID INT FOREIGN KEY Students.id,
    scheduleID INT FOREIGN KEY ScheduleDateAndTimes.id
)

Удалить Students.scheduleDateAndTime_id. Когда вы получите Students.scheduleDateAndTime_id, вставьте строку в StudentSchedule. Если у студента может быть только один scheduleDateAndTimeid, то сделайте StudentSchedule.studentID уникальным.

0 голосов
/ 02 июня 2019

У вас есть значение null в этом столбце. Выполните какое-либо обновление (например, Sql("UPDATE t SET c = 1 WHERE c IS NULL") для этих null значений до этой миграции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...