CRL快速开发框架系列教程一(Code First数据表不需再关心) – hubro – 博客园 -Mikel

CRL快速开发框架系列教程一(Code First数据表不需再关心) – hubro – 博客园

2019年12月4日 分类: C#, 数据库, 架构设计

来源: CRL快速开发框架系列教程一(Code First数据表不需再关心) – hubro – 博客园

本系列目录

  1. CRL快速开发框架系列教程一(Code First数据表不需再关心)
  2. CRL快速开发框架系列教程二(基于Lambda表达式查询)
  3. CRL快速开发框架系列教程三(更新数据)
  4. CRL快速开发框架系列教程四(删除数据)
  5. CRL快速开发框架系列教程五(使用缓存)
  6. CRL快速开发框架系列教程六(分布式缓存解决方案)
  7. CRL快速开发框架系列教程七(使用事务)
  8. CRL快速开发框架系列教程八(使用CRL.Package)
  9. CRL快速开发框架系列教程九(导入/导出数据)
  10. CRL快速开发框架系列教程十(导出对象结构)
  11. CRL快速开发框架系列教程十一(大数据分库分表解决方案)
  12. CRL快速开发框架系列教程十二(MongoDB支持)
  13. CRL快速开发框架系列教程十三(嵌套查询)

 正文

在面向对象的概念越来越深入的今天,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开发文档


标签:
本文的评论功能被关闭了.
备案信息冀ICP 0007948