Code-First創(chuàng)建數(shù)據(jù)庫

Code-First 創(chuàng)建領(lǐng)域類

與DBFirst不同的而是,我們不需要先建立數(shù)據(jù)庫,而是先開始寫類。根據(jù)我們的需要,我們在EF_CoreDomain中先創(chuàng)建兩個(gè)簡單的Question類和Option類。如下所示:

Question類

  
    public class Question
    {
        //id主鍵
        public int QuestionId { get; set; }
        //問題描述
        public string QuestionDesc { get; set; }
        //問題類型:單選題,多選題,判斷題等等
        public string QuestionType { get; set; }
        //答案
        public string Answer { get; set; }

        public bool IsDeleted { get; set; }

        //選項(xiàng)
        public ICollection<Option> Options { get; set; }
    }

當(dāng)時(shí)這個(gè)類的QuestionId 我命名為QID ,在運(yùn)行最後的web程序的時(shí)候,添加數(shù)據(jù)會報(bào)錯(cuò)沒有主鍵,我重新命名為類名+Id就通過了,Option類也遇到同樣的問題。(__) 後面會有答案哦。

Option 類

  public class Option
{
    public int OptionId { get; set; }
    //選項(xiàng)描述
    public string OptionDesc { get; set; }
    public int QuestionId { get; set; }
    //對應(yīng)的問題
    public Question Question { get; set; }
    

}

現(xiàn)在,我們已經(jīng)為在線應(yīng)用考試程序建立好了初始領(lǐng)域類。Code-First方法也需要繼承[DbContext](http:/7/1/2016 2:31:05 PM /www.entityframeworktutorial.net/EntityFramework4.3/dbcontext-vs-objectcontext.aspx)的上下文類。

Code-First 創(chuàng)建上下文類

接下來在EF_EntityFrameWork項(xiàng)目中建立上下文類,該類繼承DbContext類,具有用公共DbSet屬性,DbSet泛型結(jié)構(gòu)是你所需要的領(lǐng)域類,比如Question和Option類,在這種情況下,DbSet是一個(gè)實(shí)體類的集合(又稱實(shí)體集),因此我們命名屬性名稱通常使用實(shí)體名稱的複數(shù)形式,比如Quesitons和Options

如果在你的類型沒有做數(shù)據(jù)注釋Table屬性或者沒有FluntAPI配置表名信息,默認(rèn)的數(shù)據(jù)庫對應(yīng)的表名稱既是上述的屬性名稱。
本例子中的表明通過DataAnnotation獨(dú)立命名。

public class QuestionContext:DbContext
{
    public QuestionContext()
        : base("EF_CodeFirst")
    {
    
    }

    public DbSet<Question> Questions { get; set; }

    public DbSet<Option> Options { get;set;}
}

創(chuàng)建數(shù)據(jù)庫連接

在web項(xiàng)目的webconfig文件中的configuration節(jié)點(diǎn)中加入如下字符串連接。

<connectionStrings>
    <add name="EF_CodeFirst" connectionString="Server=(local);Database=EF_CodeFirst;Integrated Security=SSPI" providerName="System.Data.SqlClient" />
</connectionStrings>  

在其他應(yīng)用程序中可能是appconfig,按照項(xiàng)目類型不同配置文件名稱可能不同。

運(yùn)行程序。

在空的MVC項(xiàng)目中,應(yīng)用前面所提到的兩個(gè)項(xiàng)目,建立默認(rèn)訪問的控制器以及視圖(這些內(nèi)容請參考MVC,不再概述)。代碼如下:

public ActionResult Index()
    {
        using (var ctx = new QuestionContext())
        {
            Question qs = new Question()
            {
                QuestionDesc = "test()",
                QuestionType = "單選題",
                Answer = "A"
            };
            ctx.Questions.Add(qs);
            ctx.SaveChanges();
            Option op = new Option()
            {
                OptionDesc = "A.1",
                QuestionId = qs.QuestionId,
            };
            Option op1 = new Option()
            {
                OptionDesc = "B.2",
                QuestionId = qs.QuestionId,
            };
            Option op2 = new Option()
            {
                OptionDesc = "C.3",
                QuestionId = qs.QuestionId,
            };
            Option op3 = new Option()
            {
                OptionDesc = "D.4",
                QuestionId = qs.QuestionId,
            };

            ctx.Options.Add(op);
            ctx.Options.Add(op1);
            ctx.Options.Add(op2);
            ctx.Options.Add(op3);
            ctx.SaveChanges();    
        }
        return View();
    }
}

按照領(lǐng)域驅(qū)動設(shè)計(jì)來說,Web展現(xiàn)層是不應(yīng)該直接引用領(lǐng)域?qū)樱菓?yīng)該通過應(yīng)用層去訪問,不過本例子重在說明EFCode-First功能,暫時(shí)就這樣使用。

F5運(yùn)行程序,程序正常運(yùn)行并跳轉(zhuǎn)到首頁視圖界面。你也會非誠驚訝的發(fā)現(xiàn),這些數(shù)據(jù)已經(jīng)成功插入到數(shù)據(jù)庫。

但是,數(shù)據(jù)庫在哪?對應(yīng)表及它的字段是什麼?

這就是實(shí)體框架代碼優(yōu)先API的魅力所在。它根據(jù)你傳遞到上下文基類的構(gòu)造函數(shù)的參數(shù)自動創(chuàng)建數(shù)據(jù)庫,即使你沒有傳遞任何參數(shù)給上下文類的構(gòu)造函數(shù),它會自動在本機(jī)SQLEXPRESS數(shù)據(jù)庫創(chuàng)建"項(xiàng)目名稱.上下文類名稱"的數(shù)據(jù)庫。本例數(shù)據(jù)表結(jié)構(gòu)如下:

DB.jpg

在上圖中可以看出,它在數(shù)據(jù)庫中創(chuàng)建了兩張表,dt_Question和dt_Option.這兩張表是基於上面所定義的Question和Options領(lǐng)域類來創(chuàng)建的。

正如上面截圖所看到的,它創(chuàng)建了包含了適當(dāng)數(shù)據(jù)類型及長度的字段的兩張數(shù)據(jù)表。字段的名稱和數(shù)據(jù)類型與各自對應(yīng)的領(lǐng)域類向匹配。它也設(shè)置了各自表的主鍵,同時(shí)在dt_Option表中設(shè)置QuestionId 為外鍵。

用這種方法,無需先創(chuàng)建數(shù)據(jù)庫,你可以直接開始寫程序,最終通過你的領(lǐng)域類來創(chuàng)建數(shù)據(jù)庫。

你一定會有疑問,它是如何創(chuàng)建字段,如何設(shè)置適當(dāng)?shù)臄?shù)據(jù)類型和長度,如何創(chuàng)建主鍵和外鍵,對不對?答案就是:Code-First的約定

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 程序員創(chuàng)業(yè)白皮書 作者:Paul Graham Paul Graham是程序員,專欄作家。他在1995年創(chuàng)建了第一...
    劉立山John閱讀 1,961評論 0 20
  • 為何叫做 shell ? shell prompt(PS1) 與 Carriage Return(CR) 的關(guān)系?...
    Zero___閱讀 3,185評論 3 49
  • 在Cousera上跟的那門泛函結(jié)課了,最后的考試是一組12個(gè)問題給你兩個(gè)星期做,然后我拖到最后一天晚上發(fā)現(xiàn)寫不完,...
    猴子已死閱讀 185評論 3 1
  • 我們是一群鳥 彼此啄食著對方的心臟 后來我醒來了,哭得厲害 而這只是一個(gè)過于真實(shí)的 ——夢 2015-3-31
    郁衡子閱讀 262評論 0 0
  • 張大凝的Markdown&Scrum初體驗(yàn) 前幾行是為了測試我是否正確的使用了Markdown 接下來測試有序和無...
    張大凝閱讀 516評論 0 0