首页 > 解决方案 > 实体框架级联删除无法正常工作

问题描述

我正在使用带有 SQlite 数据库的 EF6 开发 WPF 应用程序。我在数据库中有三个表:

课程:

CREATE TABLE "Classes" (
    "Id"    INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
    "Name"  TEXT,
    "SeasonId"  INTEGER,
    FOREIGN KEY("SeasonId") REFERENCES "Seasons"("Id") ON DELETE CASCADE
);

季节:

CREATE TABLE "Seasons" (
    "Id"    INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
    "Name"  TEXT
);

学生:

CREATE TABLE "Students" (
    "Id"    INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
    "FirstName" TEXT,
    "LastName"  TEXT,
    "Number"    TEXT,
    "Points"    TEXT,
    "ClassId"   INTEGER,
    "SeasonId"  INTEGER,
    FOREIGN KEY("ClassId") REFERENCES "Classes"("Id") ON DELETE CASCADE,
    FOREIGN KEY("SeasonId") REFERENCES "Seasons"("Id") ON DELETE CASCADE
);

我有一对多的关系:
- 一个季节实体可以有很多班级和学生。
- 一个班级实体可以在一个季节拥有多个学生。 - 一个学生实体有一个班级和一个赛季。我的实体类:

季节.vb

Namespace Models
    Public Class Season
        Public Property Id As Integer
        Public Property Name As String
        Public Property Students As ICollection(Of Student)
        Public Property Classes As ICollection(Of [Class])
    End Class
End Namespace

类.vb

Namespace Models
    Public Class [Class]
        Public Property Id As Integer
        Public Property SeasonId As Integer
        Public Property Name As String
        Public Property Students As ICollection(Of Student)
        Public Property Season As Season
    End Class
End Namespace

学生.vb

Namespace Models
    Public Class Student
        Public Property Id As Integer
        Public Property SeasonId As Integer
        Public Property ClassId As Integer
        Public Property FirstName As String
        Public Property LastName As String
        Public Property Number As Integer
        Public Property Points As Integer
        Public Property Season As Season
        Public Property [Class] As [Class]
    End Class
End Namespace

还有我的DbContext 类

Namespace Data
    Public Class Context
        Inherits DbContext
        Public Overridable Property Students As DbSet(Of Student)
        Public Overridable Property Seasons As DbSet(Of Season)
        Public Overridable Property Classes As DbSet(Of [Class])

        Public Sub New()
            MyBase.New("name=DbConnString")
        End Sub
        Protected Overrides Sub OnModelCreating(modelBuilder As DbModelBuilder)

            modelBuilder.Entity(Of Student).ToTable("Students")
            modelBuilder.Entity(Of Season).ToTable("Seasons")
            modelBuilder.Entity(Of [Class]).ToTable("Classes")

            modelBuilder.Entity(Of [Class]).HasMany(Function(c) c.Students).WithRequired(Function(s) s.Class).HasForeignKey(Function(s) s.ClassId)

            modelBuilder.Entity(Of Season).HasMany(Function(s) s.Classes).WithRequired().HasForeignKey(Function(c) c.SeasonId)
            modelBuilder.Entity(Of Season).HasMany(Function(s) s.Students).WithRequired().HasForeignKey(Function(s) s.SeasonId)

            MyBase.OnModelCreating(modelBuilder)
        End Sub

    End Class
End Namespace

如果我使用 DB Browser for SQlite 从数据库中手动删除季节实体,所有子实体都会自动删除。
如果我使用代码添加新数据并立即删除它,它会按预期工作并删除所有子实体。
但是,如果我使用 DB Browser 手动将数据添加到数据库中,或者如果我使用代码添加数据,请关闭应用程序,再次运行,然后尝试删除Season 实体子实体未删除。

这是我的删除方法

Public Shared Function DeleteSeason(ByVal s As Season) As String
        Try
            Using db As New Context
                db.Seasons.Attach(s)
                db.Seasons.Remove(s)
                db.SaveChanges()
            End Using
            Return ""
        Catch ex As Exception
            Return ex.Message
        End Try
    End Function

我假设它与我的 DbContext 实例没有跟踪子实体的状态有关,否则我可能完全错了。
任何帮助,将不胜感激。

标签: vb.netentity-frameworksqlitecascade

解决方案


推荐阅读