1.建立级联删除
Mr.E的级联删除并非数据库自带那个级联删除,而是Mr.E自带的,所以它能触发你C#里面编写的触发器。
首先,建立级联删除关系,如下图有两个表,UserInfo和UserDocument,
UserDocument表依靠UserID字段,和UserInfo联系起来。现在我要实现,当UserInfo里面的数据删除时,自动删除UserDocument表里面UserID=UserInfo.id的那些数据,应该怎么做呢?
首先,双击UserInfo打开它的属性编辑器,点击【级联删除】设置项,添加级联删除关系
然后编译数据库dll,我们去代码那里实验一下。
2.触发器
首先新建一个UserDocumentAction类,继承EntityDB.ActionCapture<Test.UserDocument>,作为UserDocument表的触发器
using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; namespace LinqTest1 { public class UserDocumentAction : EntityDB.ActionCapture<Test.UserDocument> { public override void BeforeInsert(object database, EntityDB.DatabaseModifyEventArg e) { Debug.WriteLine("UserDocument BeforeInsert"); } public override void AfterInsert(object database, EntityDB.DatabaseModifyEventArg e) { var data = (Test.UserDocument)e.DataItem; Debug.WriteLine(string.Format("UserDocument发现有新的数据,id={0} FileName={1}" , data.id , data.FileName)); } public override void BeforeUpdate(object database, EntityDB.DatabaseModifyEventArg e) { } public override void AfterUpdate(object database, EntityDB.DatabaseModifyEventArg e) { } public override void BeforeDelete(object database, EntityDB.DatabaseModifyEventArg e) { var db = (Test.DB.TestDB)database; var data = (Test.UserDocument)e.DataItem; //data只有id字段有值,所以要把所有字段的值都取出来,需要去数据库那里取一次 data = db.UserDocument.FirstOrDefault(m=>m.id == data.id); Debug.WriteLine("数据即将删除:FileName=" + data.FileName + " Desc=" + data.Desc); } public override void AfterDelete(object database, EntityDB.DatabaseModifyEventArg e) { Debug.WriteLine("UserDocument AfterDelete"); } } }
然后在应用程序入口的地方,注册这个触发器
/// <summary> /// 应用程序的主入口点。 /// </summary> [STAThread] static void Main() { EntityDB.DBContext.AddActionCapture(new UserDocumentAction()); Application.Run(new Form1()); }
再编写插入数据,删除数据的代码,看看UserDocumentAction是否可以正确捕获事件
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace LinqTest1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { using (var db = new Test.DB.TestDB(@"data source=""F:\SqliteLinqTest\TestDB""", EntityDB.DatabaseType.Sqlite)) { //开始事务 db.BeginTransaction(); try { //添加UserInfo表数据 var user = new Test.UserInfo(); user.UserName = "张三"; user.Password = "; db.Update(user); //添加UserDocument表数据 var userDoc = new Test.UserDocument(); userDoc.UserID = user.id; userDoc.FileName = "d:\\测试文档.doc"; userDoc.Desc = "测试文档"; db.Update(userDoc); //删除user db.Delete(user); //提交事务 db.CommitTransaction(); } catch { //回滚事务 db.RollbackTransaction(); throw; } } } } }
运行代码,发现db.Delete(user);删除user的数据的时候,级联删除起作用了,自动删除UserDocument里面的数据,并且被UserDocumentAction这个触发器捕捉到这个事件。