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 = "123"; 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這個觸發器捕捉到這個事件。