.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 = ";
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) 教程(三)更新已发布的数据库
项目发布到服务器后,如果在后期,数据库的结构发生变更,如何更新到服务器呢? 首先,右键点击数据库,导出结构脚本文件 把脚本文件和 Mr.E.rar拷贝到服务器,在服务器解压Mr.E,运行其中的“更新数 ...
- SQL 修改字段类型和长度,常见类型介绍及数据库设计工具PowerDesigner和astah
1.电话字段设置24个Byte竟然不够,好吧设置为50的长度. alter table <表名> alter column <字段名> 新类型名(长度) 举例: ) 2.删除一 ...
- 严重推荐一个免费开源数据库建模工具软件 --OpenSystemArchitect 4.0
嘿嘿,对于我这样的新手,这个工具还是很令人兴奋的. 真的是术业有专攻啊.关键还是免费开源 EXCEL,VISO,PPT,PS,CD,FREEHAND不是不可以,只是.人家还是专业点,方便点.. Ope ...
- Echarts 一个开源图表设计工具
一般来说,因有所需,方有所求.最近项目中有这方面的需求,用着感觉不错.特此记录!此处仅是一个简单的demo.官网地址:http://echarts.baidu.com/,相关文档.插件都有. 1.js ...
- 数据库设计工具-powerdesigner
一.PowerDesigner导出SQL,注释为空时以name代替 操作步骤 1. 2. 3.将Value中的内容全部替换为如下 %:COLUMN% [%National%?national ]%DA ...
- MySQL Workbench是一款专为MySQL设计的ER/数据库建模工具
MySQL Workbench是一款专为MySQL设计的ER/数据库建模工具.它是著名的数据库设计工具DBDesigner4的继任者.你可以用MySQL Workbench设计和创建新的数据库 ...
- 数据库设计_ERMaster安装使用_PowerDesigner数据设计工具
数据库设计 1. 说在前面 项目开发的流程包括哪些环节 需求调研[需求调研报告]-- 公司决策层 (1) 根据市场公司需求分析公司是否需要开发软件来辅助日常工作 (2) 公司高层市场考察,市场分析,决 ...
- .net走向设计2—设计工具
1.思维导图 2.项目管理工具 3.常用UML工具 4.数据库设计工具
- 循序渐进开发WinForm项目(1) --数据库设计和项目框架的生成
随笔背景:在很多时候,很多入门不久的朋友都会问我:我是从其他语言转到C#开发的,有没有一些基础性的资料给我们学习学习呢,你的框架感觉一下太大了,希望有个循序渐进的教程或者视频来学习就好了. 其实也许我 ...
随机推荐
- def
a = 97,A = 65,z = 122,Z = 90 小写字母比大写字母整形数值高,upper->lower相差32 把小写字母转化成大写字母,将小写字母 - 32 1. typedef 数 ...
- Objective-C中#define的常见用法
参考博客 http://blog.csdn.net/kindazrael/article/details/8108868 在C语言中,预处理代码是非常强大的工具,能让代码变得可读性和可维护性更强.预处 ...
- Python之路【第九篇】:Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy
Python之路[第九篇]:Python操作 RabbitMQ.Redis.Memcache.SQLAlchemy Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用 ...
- C puzzles详解【26-30题】
第二十六题(不会) The following is a simple program which implements a minimal version of banner command ava ...
- 转:OpenCms 9.0.1汉化
LHD私人汉化. 1.完成安装OpenCms 2.如果正确安装,在浏览器输入以下地址即可打开登录页面(默认账号/密码:Admin/admin) http://localhost:8080/opencm ...
- C#语法基础和面向对象编程
1.C#语法基础 http://www.cnblogs.com/tonney/archive/2011/03/16/1986456.html 2.C#与面向对象基础 很棒的资源,简明扼要,介绍的非常清 ...
- LotusPhp中配置文件组件LtConfig详解
LotusPhp中配置文件组件LtConfig是约定的一个重要组成部分,适用于多个场景,多数的LotusPhp组件如数据库,缓存,RBAC,表单验证等都需要用到配置组件,LtConfig配置组件也是L ...
- 重回程序员之路。重写博客。我的ecshop小京东二开问题汇总与解决方案。
问题1:混合支付(余额支付+在线支付)不跟更新订单状态问题. 解决方案:http://bbs.ecshop.com/viewthread.php?tid=156761&highlight= i ...
- Delphi XE5 for android 使用 BITMAP STYLE DESIGNER 改变控件背景
一.BITMAP STYLE DESIGNER 工具集成在IDE开发工具的TOOLS菜单. 使用NEW 新建一个安卓样式.NEW—NEW ANDROID STYLE FOR FIREMONKEY. 这 ...
- ORACLE DG之参数详解
1.DB_NAME 数据库名字,需要保持同一个Data Guard中所有数据库DB_NAME相同. 主库和备库相同 DB_NAME='chicago' DB_NAME='chicago' 2.DB_U ...