Code-First創建數據庫

Code-First 創建領域類

與DBFirst不同的而是,我們不需要先建立數據庫,而是先開始寫類。根據我們的需要,我們在EF_CoreDomain中先創建兩個簡單的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; }

        //選項
        public ICollection<Option> Options { get; set; }
    }

當時這個類的QuestionId 我命名為QID ,在運行最後的web程序的時候,添加數據會報錯沒有主鍵,我重新命名為類名+Id就通過了,Option類也遇到同樣的問題。(__) 後面會有答案哦。

Option 類

  public class Option
{
    public int OptionId { get; set; }
    //選項描述
    public string OptionDesc { get; set; }
    public int QuestionId { get; set; }
    //對應的問題
    public Question Question { get; set; }
    

}

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

Code-First 創建上下文類

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

如果在你的類型沒有做數據注釋Table屬性或者沒有FluntAPI配置表名信息,默認的數據庫對應的表名稱既是上述的屬性名稱。
本例子中的表明通過DataAnnotation獨立命名。

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

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

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

創建數據庫連接

在web項目的webconfig文件中的configuration節點中加入如下字符串連接。

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

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

運行程序。

在空的MVC項目中,應用前面所提到的兩個項目,建立默認訪問的控制器以及視圖(這些內容請參考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();
    }
}

按照領域驅動設計來說,Web展現層是不應該直接引用領域層,而是應該通過應用層去訪問,不過本例子重在說明EFCode-First功能,暫時就這樣使用。

F5運行程序,程序正常運行并跳轉到首頁視圖界面。你也會非誠驚訝的發現,這些數據已經成功插入到數據庫。

但是,數據庫在哪?對應表及它的字段是什麼?

這就是實體框架代碼優先API的魅力所在。它根據你傳遞到上下文基類的構造函數的參數自動創建數據庫,即使你沒有傳遞任何參數給上下文類的構造函數,它會自動在本機SQLEXPRESS數據庫創建"項目名稱.上下文類名稱"的數據庫。本例數據表結構如下:

DB.jpg

在上圖中可以看出,它在數據庫中創建了兩張表,dt_Question和dt_Option.這兩張表是基於上面所定義的Question和Options領域類來創建的。

正如上面截图所看到的,它創建了包含了適當數據類型及長度的字段的兩張數據表。字段的名稱和數據類型與各自對應的領域類向匹配。它也設置了各自表的主鍵,同時在dt_Option表中設置QuestionId 為外鍵。

用這種方法,無需先創建數據庫,你可以直接開始寫程序,最終通過你的領域類來創建數據庫。

你一定會有疑問,它是如何創建字段,如何設置適當的數據類型和長度,如何創建主鍵和外鍵,對不對?答案就是:Code-First的約定

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容

  • 程序員創業白皮書 作者:Paul Graham Paul Graham是程序員,專欄作家。他在1995年創建了第一...
    刘立山John阅读 1,847评论 0 20
  • 为何叫做 shell ? shell prompt(PS1) 与 Carriage Return(CR) 的关系?...
    Zero___阅读 3,138评论 3 49
  • 在Cousera上跟的那门泛函结课了,最后的考试是一组12个问题给你两个星期做,然后我拖到最后一天晚上发现写不完,...
    猴子已死阅读 179评论 3 1
  • 我们是一群鸟 彼此啄食着对方的心脏 后来我醒来了,哭得厉害 而这只是一个过于真实的 ——梦 2015-3-31
    郁衡子阅读 237评论 0 0
  • 张大凝的Markdown&Scrum初体验 前几行是为了测试我是否正确的使用了Markdown 接下来测试有序和无...
    张大凝阅读 420评论 0 0