簡體   English   中英

使用Entity Framework保存具有外鍵約束的數據

[英]Using Entity Framework to save data that have foreign key constraints

我正在編寫一個從文件中讀取數據然后更新數據庫的代碼(即刪除整個數據庫並重新填充表格)

我有以下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. 保存更改

它引發了異常

為了確定問題在哪里嘗試在每個ctx.SaveChanges()上設置斷點; 並調試您的應用程序

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

找到導致問題的表后,使用foreach循環嘗試為每個條目插入和SaveChanges並檢查哪個行有問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM