CRL快速开发框架系列教程一(Code First数据表不需再关心)(转载)
在面向对象的概念越来越深入的今天,Code First开发模式想必也不再陌生,开发关注点由数据库为主变为以对象结构为主
在开发程序时,以编程的思想去考虑,如何用对象结构表示这一数据结构,至于数据结构的载体是什么数据库,无所谓了
在面得对象的框架中,EF是做得比较好了,特别是Code First模式下,数据表能自动生成,相比一般的形式,建立对象,再按对象生成数据库脚表,好多重复工作
CRL同样采用Code First开发模式,更值得一提的是,数据结构是自动创建的,无论是增加对象,或增加对象的属性(当然没能自动删除)
对象定义
CRL对象需要继承IModel或IModelBase,它们之间的区别:
- IModel是一个抽象类,不包含任何属性,继承它可以定义自定义类型的主建字段,如GUID类型的主键
- IModelBase包含int类型主键ID和AddTime字段,继承后满路一般自增主建要求
来看一个简单对象定义
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
[CRL.Attribute.Table(TableName = "TestModel_1")]//定义映射名public class TestModel : CRL.IModel{ [CRL.Attribute.Field(IsPrimaryKey = true)]//定义为主键 public int Id { get; set; } [CRL.Attribute.Field(Length = 50)]//定义列长度 public string Name { get; set; }} |
在上面定义中使用了CRL.Attribute.Table和CRL.Attribute.Field属性标注,当要指定对应的数据结限定,使用此标注即可
创建对象管理类
|
1
2
3
4
5
6
7
8
9
10
|
public class TestModelManage : CRL.BaseProvider<TestModel>{ public static TestModelManage Instance { get { return new TestModelManage(); } }} |
调用试试看(重点来了,一般框架肯定会报错,找不到数据表,CRL不会,因为它自动创建了)
|
1
|
var data = TestModelManage.Instance.QueryList(b => b.Id > 0); |
看数据库里结构

再增加一个属性 Name2,重编译运行上面代码

可以看到增加的属性自动创建了对应的字段
CRL如何做到这点
- CRL在对象被调用时,会检查一次数据结构,看和对象定义是不是一致,如果有少了就创建表或字段(当然不是直接从数据库里查,那样效率太低了,也耗资源)
- 对象检查会耗费一些资源,只建议在开发阶段使用,上线后可以通过CRL.SettingConfig.CheckModelTableMaping设置开关
对象数据检查
除数据表结构检查,CRL还可以对数据作检查
上面对象定义了Name长度为50,在插入此数据时,如果数据长度超过了50,会怎么样呢
|
1
2
3
|
var data2 = new TestModel(); data2.Name = "这是一个超过50的字符串这是一个超过50的字符串这是一个超过50的字符串这是一个超过50的字符串这是一个超过50的字符串这是一个超过50的字符串这是一个超过50的字符串这是一个超过50的字符串这是一个超过50的字符串"; TestModelManage.Instance.Add(data2); |
正常会报数据库错误,如SQL会报将截断字符串,也不会告诉你是哪个字段,而CRL会抛出异常

也可以对数据自定义检查
重写TestModel的CheckData方法,这里就可以自由发挥了,如按业务规则,从根本上封堵了错误数据的产生
|
1
2
3
4
5
6
7
8
|
public override string CheckData() { if (Name!="hubro") { return "输入的值?"; } return base.CheckData(); }<br> |
data2.Name = "ggy";
TestModelManage.Instance.Add(data2);
运行结果

重复数据提交判断
当在短时间内, 插入相同的数据,CRL默认为重复提交了,重复依据为数据内容MD5值
同时插入两条相同的数据
|
1
2
3
4
5
6
|
var data2 = new TestModel(); data2.Name = "hubro"; TestModelManage.Instance.Add(data2); var data3 = new TestModel(); data3.Name = "hubro"; TestModelManage.Instance.Add(data3); |
运行如下

若要关闭,重写TestModel方法
|
1
2
3
4
5
6
7
|
protected override bool CheckRepeatedInsert { get { return false; } } |
CRL Code First开发方式介绍到这里
更详细的例子见CRL开发文档

浙公网安备 33010602011771号