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开发文档

posted @ 2016-11-07 12:23  走小天  阅读(129)  评论(0)    收藏  举报