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

.Net开源数据库设计工具Mr.E For Linq (EF 6.1) 教程(二)级联删除和触发器的更多相关文章

  1. .Net开源数据库设计工具Mr.E For Linq (EF 6.1) 教程(三)更新已发布的数据库

    项目发布到服务器后,如果在后期,数据库的结构发生变更,如何更新到服务器呢? 首先,右键点击数据库,导出结构脚本文件 把脚本文件和 Mr.E.rar拷贝到服务器,在服务器解压Mr.E,运行其中的“更新数 ...

  2. SQL 修改字段类型和长度,常见类型介绍及数据库设计工具PowerDesigner和astah

    1.电话字段设置24个Byte竟然不够,好吧设置为50的长度. alter table <表名> alter column <字段名> 新类型名(长度) 举例: ) 2.删除一 ...

  3. 严重推荐一个免费开源数据库建模工具软件 --OpenSystemArchitect 4.0

    嘿嘿,对于我这样的新手,这个工具还是很令人兴奋的. 真的是术业有专攻啊.关键还是免费开源 EXCEL,VISO,PPT,PS,CD,FREEHAND不是不可以,只是.人家还是专业点,方便点.. Ope ...

  4. Echarts 一个开源图表设计工具

    一般来说,因有所需,方有所求.最近项目中有这方面的需求,用着感觉不错.特此记录!此处仅是一个简单的demo.官网地址:http://echarts.baidu.com/,相关文档.插件都有. 1.js ...

  5. 数据库设计工具-powerdesigner

    一.PowerDesigner导出SQL,注释为空时以name代替 操作步骤 1. 2. 3.将Value中的内容全部替换为如下 %:COLUMN% [%National%?national ]%DA ...

  6. MySQL Workbench是一款专为MySQL设计的ER/数据库建模工具

      MySQL  Workbench是一款专为MySQL设计的ER/数据库建模工具.它是著名的数据库设计工具DBDesigner4的继任者.你可以用MySQL  Workbench设计和创建新的数据库 ...

  7. 数据库设计_ERMaster安装使用_PowerDesigner数据设计工具

    数据库设计 1. 说在前面 项目开发的流程包括哪些环节 需求调研[需求调研报告]-- 公司决策层 (1) 根据市场公司需求分析公司是否需要开发软件来辅助日常工作 (2) 公司高层市场考察,市场分析,决 ...

  8. .net走向设计2—设计工具

    1.思维导图 2.项目管理工具 3.常用UML工具 4.数据库设计工具

  9. 循序渐进开发WinForm项目(1) --数据库设计和项目框架的生成

    随笔背景:在很多时候,很多入门不久的朋友都会问我:我是从其他语言转到C#开发的,有没有一些基础性的资料给我们学习学习呢,你的框架感觉一下太大了,希望有个循序渐进的教程或者视频来学习就好了. 其实也许我 ...

随机推荐

  1. java基础回顾(七)——ThreadPoolExecutor

    先来看一下构造函数 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeU ...

  2. [设计模式 3] 用设计模式的眼光看MVC框架

    导读:之前一直在区分MVC和设计模式的区别,但是,既然有些人认为MVC是一种设计模式,那么它们之间肯定是有共通之处的.所以,本篇博客,就用设计模式的眼光来看MVC框架.仅是本人对于MVC的粗鄙看法,还 ...

  3. coffeeScript 语法总结

    CoffeeScript ---->安装node.js ---->安装coffeeScript 语句: 注意:没有分号,语句由新的一行结束:多条语句写到同一行时需要分号表示一条语句的结束( ...

  4. php获取文件创建时间、修改时间

    filemtime ( string filename ) 返回文件上次被修改的时间,出错时返回 FALSE.时间以 Unix 时间戳的方式返回,可用于 date(). 例如:$a=filemtime ...

  5. SQLserver2008使用表达式递归查询(由父往子,由子往父)

    SQLserver2008使用表达式递归查询语句 --由父项递归下级 with cte(id,parentid,text) as (--父项 select id,parentid,text from ...

  6. C# 正则表达式及常用正则表达式

    元字符 描述 .点 匹配任何单个字符.例如正则表达式r.t匹配这些字符串:rat.rut.r t,但是不匹配root. $ 匹配行结束符.例如正则表达式weasel$ 能够匹配字符串"He' ...

  7. Javascrpt

    HTML HTML概述: HTML是英文Hyper Text Mark-up Language(超文本标记语言)的缩写,他是一种制作万维网页面标准语言(标记).相当于定义统一的一套规则,大家都来遵守他 ...

  8. 必须会的SQL语句(六)查询

    1.基础的查询     1)重命名列     select name as '姓名' from 表名       2)定义常量列     select 是否 ='是' from 表名       3) ...

  9. .net4.0注册到IIS

    IIS和.netfw4.0安装顺序是从前到后,如果不小心颠倒了,无所谓. 打开程序-运行-cmd:输入一下命令重新注册IIS C:\WINDOWS\Microsoft.NET\Framework\v4 ...

  10. 类名 对象名 =new 类名();

    类名 对象名 =new 类名();该怎么理解 类名 对象名 =new 类名();=左边:创建一个类的对象=右边:调用这个类的构造函数初始化对象,类名()这个是构造函数,用来做初始化的.