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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了.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");
        }
    }
}

然后再编写插入数据,删除数据的代码,看看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这个触发器捕捉到这个事件。

以上是关于.Net开源数据库设计工具Mr.E For Linq (EF 6.1) 教程级联删除和触发器的主要内容,如果未能解决你的问题,请参考以下文章

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

.Net开源数据库设计工具Mr.E For Linq (EF 6.1) 教程枚举类型的字段

.NET for Apache® Spark? 开源大数据分析工具

Mr.E 的用户管理

.NET Core Grpc 实现通信

5个经常使用的开源聊天应用