Использование Entity Framework для сохранения данных с ограничениями внешнего ключа

Я пишу код, который читает данные из файлов, а затем обновляет БД (т.е. удаляет всю БД и пополняет таблицы)

У меня есть следующие 4

Курсы

CREATE TABLE Courses (
    [Id]          INT           IDENTITY (1, 1) NOT NULL,
    [Name]        NVARCHAR (50) NULL,
    [SubjectCode] INT           NOT NULL,
    CONSTRAINT [PK_Courses] PRIMARY KEY CLUSTERED ([Id] ASC),
);

Специализации

CREATE TABLE Specializtions (
    [Id]    INT           NOT NULL,
    [Name]  NVARCHAR (50) NULL,
    [DepId] INT           NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC),
    CONSTRAINT [FK_Specializtions_To_Departments] FOREIGN KEY ([DepId]) REFERENCES [dbo].[Departments] ([Id]) ON DELETE CASCADE ON UPDATE CASCADE
);

Courses_Specializations

CREATE TABLE Courses_Specializations (
    [CourseId] INT NOT NULL,
    [SpecId]   INT NOT NULL,
    PRIMARY KEY CLUSTERED ([CourseId] ASC, [SpecId] ASC),
    CONSTRAINT [FK_Courses_Specializations_ToSpecializtions] FOREIGN KEY ([SpecId]) REFERENCES [dbo].[Specializtions] ([Id]) ON DELETE CASCADE,
    CONSTRAINT [FK_Courses_Specializations_ToCourses] FOREIGN KEY ([CourseId]) REFERENCES [dbo].[Courses] ([Id]) ON DELETE CASCADE
);

Таблица отделов

CREATE TABLE Departments (
    [Id]   INT           NOT NULL,
    [Name] NVARCHAR (20) NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC)
);

Я использую следующий код:

CoursesEntities ctx = new CoursesEntities();

// create 3 lists with relevant data and enters them to db

ctx.Departments.AddRange(departments);
ctx.Courses.AddRange(courses);
ctx.Specializtions.AddRange(specializations);
ctx.SaveChanges();

и всякий раз, когда я хочу удалить всю базу данных и заполнить данные разными строками, я получаю различные ошибки, в которых говорится: "Невозможно вставить или обновить сущность, поскольку основной конец отношения" X "удален". где X - некоторое ограничение fk

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

Еще одна важная вещь, на которую стоит обратить внимание: когда я выполняю

  1. чистый дб
  2. Сохранить изменения
  3. пополнить данные
  4. Сохранить изменения

это работает нормально.. но когда я делаю

  1. чистый дб
  2. пополнить данные
  3. Сохранить изменения

это исключение

1 ответ

Решение

Чтобы быть уверенным, где проблема, попробуйте поставить точку останова на каждом ctx.SaveChanges(); и отладить ваше приложение

 ctx.Departments.AddRange(departments);
    ctx.SaveChanges();
    ctx.Courses.AddRange(courses);
    ctx.SaveChanges();
    ctx.Specializtions.AddRange(specializations);
    ctx.SaveChanges();

После нахождения таблицы, которая вызывает проблемы, с помощью цикла foreach попробуйте вставить и SaveChanges для каждой записи и проверить, в каких строках возникла проблема.

Другие вопросы по тегам