正文html
在面向对象的概念愈来愈深刻的今天,Code First开发模式想必也再也不陌生,开发关注点由数据库为主变为以对象结构为主数据库
在开发程序时,以编程的思想去考虑,如何用对象结构表示这一数据结构,至于数据结构的载体是什么数据库,无所谓了编程
在面得对象的框架中,EF是作得比较好了,特别是Code First模式下,数据表能自动生成,相比通常的形式,创建对象,再按对象生成数据库脚本,好多重复工做api
CRL一样采用Code First开发模式,更值得一提的是,数据结构是自动建立的,不管是增长对象,或增长对象的属性(固然没能自动删除)缓存
来看一个简单对象定义数据结构
[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属性标注,当要指定对应的数据结限定,使用此标注便可框架
建立对象管理类分布式
public class TestModelManage : CRL.BaseProvider<TestModel> { public static TestModelManage Instance { get { return new TestModelManage(); } } }
调用试试看(重点来了,通常框架确定会报错,找不到数据表,CRL不会,由于它自动建立了)ide
var data = TestModelManage.Instance.QueryList(b => b.Id > 0);
看数据库里结构post
再增长一个属性 Name2,重编译运行上面代码
能够看到增长的属性自动建立了对应的字段
CRL如何作到这点
上面对象定义了Name长度为50,在插入此数据时,若是数据长度超过了50,会怎么样呢
var data2 = new TestModel(); data2.Name = "这是一个超过50的字符串这是一个超过50的字符串这是一个超过50的字符串这是一个超过50的字符串这是一个超过50的字符串这是一个超过50的字符串这是一个超过50的字符串这是一个超过50的字符串这是一个超过50的字符串"; TestModelManage.Instance.Add(data2);
正常会报数据库错误,如SQL会报将截断字符串,也不会告诉你是哪一个字段,而CRL会抛出异常
也能够对数据自定义检查
重写TestModel的CheckData方法,这里就能够自由发挥了,如按业务规则,从根本上封堵了错误数据的产生
public override string CheckData() { if (Name!="hubro") { return "输入的值?"; } return base.CheckData(); }
data2.Name = "ggy";
TestModelManage.Instance.Add(data2);
运行结果
重复数据提交判断
当在短期内, 插入相同的数据,CRL默认为重复提交了,重复依据为数据内容MD5值
同时插入两条相同的数据
var data2 = new TestModel(); data2.Name = "hubro"; TestModelManage.Instance.Add(data2); var data3 = new TestModel(); data3.Name = "hubro"; TestModelManage.Instance.Add(data3);
运行以下
若要关闭,重写TestModel方法
protected override bool CheckRepeatedInsert { get { return false; } }
CRL Code First开发方式介绍到这里
更详细的例子见CRL开发文档