本系列目录

  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字段,继承后满足一般自增主键要求

来看一个简单对象定义

    [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不会,因为它自动创建了)

var data = TestModelManage.Instance.QueryList(b => b.Id > 0);

看数据库里结构

  

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

  

可以看到增加的属性自动创建了对应的字段

CRL如何做到这点

  • CRL在对象被调用时,会检查一次数据结构,看和对象定义是不是一致,如果有少了就创建表或字段(当然不是直接从数据库里查,那样效率太低了,也耗资源)
  • 对象检查会耗费一些资源,只建议在开发阶段使用,上线后可以通过CRL.SettingConfig.CheckModelTableMaping设置开关

对象数据检查

除数据表结构检查,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开发文档

CRL快速开发框架系列教程一(Code First数据表不需再关心)的更多相关文章

  1. CRL快速开发框架系列教程九(导入/导出数据)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  2. CRL快速开发框架系列教程十三(嵌套查询)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  3. CRL快速开发框架系列教程十二(MongoDB支持)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  4. CRL快速开发框架系列教程十一(大数据分库分表解决方案)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  5. CRL快速开发框架系列教程十(导出对象结构)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  6. CRL快速开发框架系列教程七(使用事务)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  7. CRL快速开发框架系列教程六(分布式缓存解决方案)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  8. CRL快速开发框架系列教程五(使用缓存)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  9. CRL快速开发框架系列教程三(更新数据)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

随机推荐

  1. B树——算法导论(25)

    B树 1. 简介 在之前我们学习了红黑树,今天再学习一种树--B树.它与红黑树有许多类似的地方,比如都是平衡搜索树,但它们在功能和结构上却有较大的差别. 从功能上看,B树是为磁盘或其他存储设备设计的, ...

  2. 关于自己写C++的一点风格

    现在,我学了很长时间的C++,但是自己就是无法精通.许多知识是入门书上没有的.现在写C++最重要的就是风格问题. 我现在的C++风格: 把自己所有的东西都放在一个名称空间下. 没有全局的函数,有的函数 ...

  3. “.Net 社区虚拟大会”(dotnetConf) 2016 Day 1 Keynote: Scott Hunter

    “.Net 社区虚拟大会”(dotnetConf) 2016 今天凌晨在Channel9 上召开,在Scott Hunter的30分钟的 Keynote上没有特别的亮点,所讲内容都是 微软“.Net社 ...

  4. 为什么做java的web开发我们会使用struts2,springMVC和spring这样的框架?

    今年我一直在思考web开发里的前后端分离的问题,到了现在也颇有点心得了,随着这个问题的深入,再加以现在公司很多web项目的控制层的技术框架由struts2迁移到springMVC,我突然有了一个新的疑 ...

  5. Dapper逆天入门~强类型,动态类型,多映射,多返回值,增删改查+存储过程+事物案例演示

    Dapper的牛逼就不扯蛋了,答应群友做个入门Demo的,现有园友需要,那么公开分享一下: 完整Demo:http://pan.baidu.com/s/1i3TcEzj 注 意 事 项:http:// ...

  6. 使用Oracle官方巡检工具ORAchk巡检数据库

    ORAchk概述 ORAchk是Oracle官方出品的Oracle产品健康检查工具,可以从MOS(My Oracle Support)网站上下载,免费使用.这个工具可以检查Oracle数据库,Gold ...

  7. ShenNiu.MVC管理系统

    本篇将要和大家分享的是一个简单的后台管理系统,这里先发个地址http://www.lovexins.com:8081/(登陆账号:youke,密码:123123:高级用户账号:gaoji,密码:123 ...

  8. .Net Core上也可以使用的二维码组件

    我Fork了QRCoder,并且兼容了.Net Core,图形库用的是ZKWeb.System.Drawing Github: https://github.com/zkweb-framework/Q ...

  9. obj.style.z-index的正确写法

    obj.style.z-index的正确写法 今天发现obj.style.z-index在js里面报错,后来才知道在js里应该把含"-"的字符写成驼峰式,例如obj.style.z ...

  10. PHP设计模式(三)抽象工厂模式(Abstract Factory For PHP)

    一.什么是抽象工厂模式 抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象 ,而且使用抽象工厂模式还要满足以下条件: 系统中有多个产品族,而系统一次只可能消费其中一族产品. 同 ...