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