Использование 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 ответ
Чтобы быть уверенным, где проблема, попробуйте поставить точку останова на каждом ctx.SaveChanges(); и отладить ваше приложение
ctx.Departments.AddRange(departments);
ctx.SaveChanges();
ctx.Courses.AddRange(courses);
ctx.SaveChanges();
ctx.Specializtions.AddRange(specializations);
ctx.SaveChanges();
После нахождения таблицы, которая вызывает проблемы, с помощью цикла foreach попробуйте вставить и SaveChanges для каждой записи и проверить, в каких строках возникла проблема.