使用 Entity Framework 保存有外键约束的数据
Using Entity Framework to save data that have foreign key constraints
我正在编写一个代码,从文件中读取数据,然后更新数据库(即删除整个数据库并重新填充 tables)
我有以下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
);
部门table
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();
每当我想删除整个数据库并用不同的行重新填充数据时,我都会收到非常错误的消息,说 "Unable to insert or update an entity because the principal end of the 'X' relationship is deleted." 其中 X 是一些 fk 约束..
我想我的问题是更新 table Courses_Specializations 因为这个 table 只包含外键所以我更新这个 table 的方法是创建 1 个专业化和1 个课程并使用导航属性将它们相互连接
另一个重要要注意的是,当我执行以下操作时
- 清理数据库
- 保存更改
- 充值数据
- 保存更改
它工作正常..但是当我这样做时
- 清理数据库
- 充值数据
- 保存更改
它抛出异常
要确定问题出在哪里,请尝试在每个 ctx.SaveChanges(); 上设置断点;并调试您的应用程序
ctx.Departments.AddRange(departments);
ctx.SaveChanges();
ctx.Courses.AddRange(courses);
ctx.SaveChanges();
ctx.Specializtions.AddRange(specializations);
ctx.SaveChanges();
找到导致问题的 table 后,使用 foreach 循环尝试为每个条目插入和 SaveChanges 并检查哪个 line/s 有问题。
我正在编写一个代码,从文件中读取数据,然后更新数据库(即删除整个数据库并重新填充 tables)
我有以下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
);
部门table
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();
每当我想删除整个数据库并用不同的行重新填充数据时,我都会收到非常错误的消息,说 "Unable to insert or update an entity because the principal end of the 'X' relationship is deleted." 其中 X 是一些 fk 约束..
我想我的问题是更新 table Courses_Specializations 因为这个 table 只包含外键所以我更新这个 table 的方法是创建 1 个专业化和1 个课程并使用导航属性将它们相互连接
另一个重要要注意的是,当我执行以下操作时
- 清理数据库
- 保存更改
- 充值数据
- 保存更改
它工作正常..但是当我这样做时
- 清理数据库
- 充值数据
- 保存更改
它抛出异常
要确定问题出在哪里,请尝试在每个 ctx.SaveChanges(); 上设置断点;并调试您的应用程序
ctx.Departments.AddRange(departments);
ctx.SaveChanges();
ctx.Courses.AddRange(courses);
ctx.SaveChanges();
ctx.Specializtions.AddRange(specializations);
ctx.SaveChanges();
找到导致问题的 table 后,使用 foreach 循环尝试为每个条目插入和 SaveChanges 并检查哪个 line/s 有问题。