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

 正文

在面向對象的概念越來越深入的今天,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開發文檔


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM