Code-First 創(chuàng)建領(lǐng)域類(lèi)
與DBFirst不同的而是,我們不需要先建立數(shù)據(jù)庫(kù),而是先開(kāi)始寫(xiě)類(lèi)。根據(jù)我們的需要澳淑,我們?cè)贓F_CoreDomain中先創(chuàng)建兩個(gè)簡(jiǎn)單的Question
類(lèi)和Option
類(lèi)。如下所示:
Question類(lèi)
public class Question
{
//id主鍵
public int QuestionId { get; set; }
//問(wèn)題描述
public string QuestionDesc { get; set; }
//問(wèn)題類(lèi)型:?jiǎn)芜x題插佛,多選題,判斷題等等
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è)類(lèi)的QuestionId 我命名為QID 量窘,在運(yùn)行最後的web程序的時(shí)候雇寇,添加數(shù)據(jù)會(huì)報(bào)錯(cuò)沒(méi)有主鍵,我重新命名為類(lèi)名+Id就通過(guò)了蚌铜,Option類(lèi)也遇到同樣的問(wèn)題锨侯。(__) 後面會(huì)有答案哦。
Option 類(lèi)
public class Option
{
public int OptionId { get; set; }
//選項(xiàng)描述
public string OptionDesc { get; set; }
public int QuestionId { get; set; }
//對(duì)應(yīng)的問(wèn)題
public Question Question { get; set; }
}
現(xiàn)在冬殃,我們已經(jīng)為在線應(yīng)用考試程序建立好了初始領(lǐng)域類(lèi)囚痴。Code-First方法也需要繼承[DbContext](http:/7/1/2016 2:31:05 PM /www.entityframeworktutorial.net/EntityFramework4.3/dbcontext-vs-objectcontext.aspx)的上下文類(lèi)。
Code-First 創(chuàng)建上下文類(lèi)
接下來(lái)在EF_EntityFrameWork項(xiàng)目中建立上下文類(lèi)审葬,該類(lèi)繼承DbContext類(lèi)深滚,具有用公共DbSet屬性,DbSet泛型結(jié)構(gòu)是你所需要的領(lǐng)域類(lèi)涣觉,比如Question和Option類(lèi)痴荐,在這種情況下,DbSet是一個(gè)實(shí)體類(lèi)的集合(又稱實(shí)體集)官册,因此我們命名屬性名稱通常使用實(shí)體名稱的複數(shù)形式生兆,比如Quesitons和Options
如果在你的類(lèi)型沒(méi)有做數(shù)據(jù)注釋Table屬性或者沒(méi)有FluntAPI配置表名信息,默認(rèn)的數(shù)據(jù)庫(kù)對(duì)應(yīng)的表名稱既是上述的屬性名稱膝宁。
本例子中的表明通過(guò)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ù)庫(kù)連接
在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)目類(lèi)型不同配置文件名稱可能不同合蔽。
運(yùn)行程序。
在空的MVC項(xiàng)目中满粗,應(yīng)用前面所提到的兩個(gè)項(xiàng)目辈末,建立默認(rèn)訪問(wèn)的控制器以及視圖(這些內(nèi)容請(qǐng)參考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ū)動(dòng)設(shè)計(jì)來(lái)說(shuō)挤聘,Web展現(xiàn)層是不應(yīng)該直接引用領(lǐng)域?qū)雍渲Γ菓?yīng)該通過(guò)應(yīng)用層去訪問(wèn),不過(guò)本例子重在說(shuō)明EFCode-First功能组去,暫時(shí)就這樣使用鞍陨。
F5運(yùn)行程序,程序正常運(yùn)行并跳轉(zhuǎn)到首頁(yè)視圖界面从隆。你也會(huì)非誠(chéng)驚訝的發(fā)現(xiàn)诚撵,這些數(shù)據(jù)已經(jīng)成功插入到數(shù)據(jù)庫(kù)。
但是键闺,數(shù)據(jù)庫(kù)在哪寿烟?對(duì)應(yīng)表及它的字段是什麼?
這就是實(shí)體框架代碼優(yōu)先API的魅力所在辛燥。它根據(jù)你傳遞到上下文基類(lèi)的構(gòu)造函數(shù)的參數(shù)自動(dòng)創(chuàng)建數(shù)據(jù)庫(kù)筛武,即使你沒(méi)有傳遞任何參數(shù)給上下文類(lèi)的構(gòu)造函數(shù),它會(huì)自動(dòng)在本機(jī)SQLEXPRESS數(shù)據(jù)庫(kù)創(chuàng)建"項(xiàng)目名稱.上下文類(lèi)名稱"的數(shù)據(jù)庫(kù)挎塌。本例數(shù)據(jù)表結(jié)構(gòu)如下:
在上圖中可以看出徘六,它在數(shù)據(jù)庫(kù)中創(chuàng)建了兩張表,dt_Question和dt_Option.這兩張表是基於上面所定義的Question和Options領(lǐng)域類(lèi)來(lái)創(chuàng)建的榴都。
正如上面截圖所看到的待锈,它創(chuàng)建了包含了適當(dāng)數(shù)據(jù)類(lèi)型及長(zhǎng)度的字段的兩張數(shù)據(jù)表。字段的名稱和數(shù)據(jù)類(lèi)型與各自對(duì)應(yīng)的領(lǐng)域類(lèi)向匹配嘴高。它也設(shè)置了各自表的主鍵竿音,同時(shí)在dt_Option表中設(shè)置QuestionId 為外鍵。
用這種方法阳惹,無(wú)需先創(chuàng)建數(shù)據(jù)庫(kù)谍失,你可以直接開(kāi)始寫(xiě)程序,最終通過(guò)你的領(lǐng)域類(lèi)來(lái)創(chuàng)建數(shù)據(jù)庫(kù)莹汤。
你一定會(huì)有疑問(wèn)快鱼,它是如何創(chuàng)建字段,如何設(shè)置適當(dāng)?shù)臄?shù)據(jù)類(lèi)型和長(zhǎng)度纲岭,如何創(chuàng)建主鍵和外鍵抹竹,對(duì)不對(duì)?答案就是:Code-First的約定