你的位置:首页 > ASP.net教程

[ASP.net教程].Net开源数据库设计工具Mr.E For Linq (EF 6.1) 教程(二)级联删除和触发器


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这个触发器捕捉到这个事件。