3

我正在编写一个从文件中读取数据然后更新数据库的代码(即删除整个数据库并重新填充表)

我有以下 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
);

课程_专业

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. 保存更改

它抛出异常

4

1 回答 1

4

为了确定问题出在哪里,请尝试在每个 ctx.SaveChanges(); 上放置断点;并调试您的应用程序

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

在找到导致问题的表后,使用 foreach 循环尝试为每个条目插入和 SaveChanges 并检查哪一行/s 有问题。

于 2016-06-15T12:06:21.680 回答