vb.net - 实体框架级联删除无法正常工作
问题描述
我正在使用带有 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 实例没有跟踪子实体的状态有关,否则我可能完全错了。
任何帮助,将不胜感激。
解决方案
推荐阅读
- mysql - 选择一列 + 另一列,最大日期
- ruby-on-rails - Ruby on Rails - 社交分享按钮宝石;修改自动填充的内容
- php - 如何检查我的ipn页面是否被coinbase ping webhook通知调用
- powershell - 移动桌面项目
- swift - 如何在具有自己的登录/注册系统的应用上实现非消耗性应用内购买?
- python - 在 Python 中从 XML 中提取数据
- angular - 选择器“app-root”不匹配任何元素|| 角度 6
- python - 在 Heroku 中更新 bson 后,Flask 应用程序损坏
- excel - 尝试激活已打开的工作簿时下标超出范围
- sensenet - 如何在 sensenet 社区版中添加文档查看器