本系列目錄
- CRL快速開發框架系列教程一(Code First數據表不需再關心)
- CRL快速開發框架系列教程二(基於Lambda表達式查詢)
- CRL快速開發框架系列教程三(更新數據)
- CRL快速開發框架系列教程四(刪除數據)
- CRL快速開發框架系列教程五(使用緩存)
- CRL快速開發框架系列教程六(分布式緩存解決方案)
- CRL快速開發框架系列教程七(使用事務)
- CRL快速開發框架系列教程八(使用CRL.Package)
- CRL快速開發框架系列教程九(導入/導出數據)
- CRL快速開發框架系列教程十(導出對象結構)
- CRL快速開發框架系列教程十一(大數據分庫分表解決方案)
- CRL快速開發框架系列教程十二(MongoDB支持)
- 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開發文檔