CRL快速開發框架系列教程一(Code First數據表不需再關心)

本系列目錄

  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快速開發框架系列教程十三(嵌套查詢)

 正文html

在面向對象的概念愈來愈深刻的今天,Code First開發模式想必也再也不陌生,開發關注點由數據庫爲主變爲以對象結構爲主數據庫

在開發程序時,以編程的思想去考慮,如何用對象結構表示這一數據結構,至於數據結構的載體是什麼數據庫,無所謂了編程

在面得對象的框架中,EF是作得比較好了,特別是Code First模式下,數據表能自動生成,相比通常的形式,創建對象,再按對象生成數據庫腳本,好多重複工做api

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不會,由於它自動建立了)ide

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

看數據庫裏結構post

  

再增長一個屬性 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開發文檔

相關文章
相關標籤/搜索