之前逛園子的時候,不少大牛寫的一些東西,什麼AOP、DDD之類的,看過以後一頭霧水,遠望大牛,回過頭看看本身,原來程序員的差距還能夠這麼大。每一個程序員都有個大牛夢想,固然小菜我也是,只是還在開始的路上。html
由於前幾天研究easyui,準備寫個mvc+ef+easyui的簡單示例,固然這對不少人來講很簡單,有段時間也研究過別人寫的,但這是小菜我第一次本身寫,勿噴。並且這周安排給本身的任務:設計模式第五篇-控制反轉(ioc),前段時間作些其餘方面的事,設計模式也很久沒寫了,因此這周必須把它完成,想研究完ioc以後,試着再寫上面的簡單示例,把ioc融入到mvc中,想一想應該有搞頭。程序員
關於Code First,昨晚無心間看到一位園友翻譯的相關教程:http://www.cnblogs.com/qouoww/archive/2011/12/31/2309066.html,這邊小弟先謝過,前面幾篇還能夠看下去,可是後面幾篇就有點不知所云了,學習是一方面,實踐是另外一方面,作的過程當中才能學到更多的東西,這邊也試着寫個關於Code First的小示例。數據庫
本身動手,豐衣足食。windows
我使用的是vs2012,若是使用vs2010須要安裝NuGet。設計模式
Nuget是一個.NET平臺下的開源的項目,它是Visual Studio的擴展。在使用Visual Studio開發基於.NET Framework的應用時,Nuget能把在項目中添加、移除和更新引用的工做變得更加快捷方便。服務器
新建-項目-Visual C#-windows-控制檯應用程序,命名爲:CodeFirstDemo。
mvc
這邊須要注意的是:選擇.net framework的時候要4.0以上版本,要否則下面NuGet安裝EntityFramework擴展的時候會報建立項目版本底沒法完成安裝的錯誤,.net framework改爲4.0就能夠了,可是換了一臺電腦3.5版本測試安裝又是好的,不知是個什麼狀況,反正.net framework版本最好選擇4.0以上。
ide
新建好CodeFirstDemo項目後,咱們先來安裝EntityFramework,項目-管理NuGet程序包-聯機-搜索「EntityFramework」,下載安裝。工具
安裝完成後會在項目下自動添加EntityFramework引用:學習
在Program.cs代碼文件中添加下面命名空間:
1 using System.Data.Entity;
Code First顧名思義就是代碼先行的意思,除了Code First,還有Model First、DatabaseFirst,關於他們幾個的區別:http://blog.bossma.cn/csharp/when-is-code-first-not-code-first/。
下面咱們在Program.cs中建立幾個模型,日常咱們能夠分離出來。
1 public class New 2 { 3 public int NewId { get; set; } 4 public string Title { get; set; } 5 6 public int NewTypeId { get; set; } 7 public virtual NewType NewType { get; set; } 8 } 9 10 public class NewType 11 { 12 public int NewTypeId { get; set; } 13 public string Name { get; set; } 14 15 public int BlogId { get; set; } 16 public virtual List<New> New { get; set; } 17 }
NewId和NewTypeId在建立的時候會作爲表的主鍵,由於包含有ID關鍵字,若是不包含的話,須要咱們指定主鍵,要否則建立就會報未找到主鍵的錯誤,添加命名空間:
1 using System.ComponentModel.DataAnnotations;
並在屬性前添加[Key]標註,指示此字段做爲主鍵,例如:
1 [Key] 2 public string UserName { get; set; }
固然除了Key,System.ComponentModel.DataAnnotations命名空間下還有其餘的Attribute,這邊就很少說,能夠查看msdn有關教程:http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.aspx。
須要注意的另一點,上面定義模型屬性的時候有virtual關鍵字,表示延遲加載,個人理解是這樣:當我訪問主實體的時候,啓動延遲加載,而不會查詢數據庫的子實體,只有要訪問它的時候纔會去數據庫查詢加載,泛型List表示此實體是一對多的關係。
EF默認是啓動延遲加載的,咱們若是不須要也能夠手動禁止:
1 db.Configuration.LazyLoadingEnabled = false;,
我對EF中上下文的理解:能夠把上下文當作一個數據庫控制器,咱們能夠在其中查詢、更改、刪除數據,而後經過鏈接獲取或是提交。就像是遙控車的遙控器同樣,EF是這個遙控器的核心部件,天線是鏈接字符串,遙控車是數據庫,這個比喻可能不是很恰當,但就是這個意思,你們都懂得。
1 public class NewsContext : DbContext 2 { 3 public DbSet<New> News { get; set; } 4 public DbSet<NewType> NewTypes { get; set; } 5 }
DbSet表示上下文中給定類型的全部實體的集合或可從數據庫中查詢的給定類型的全部實體的集合,就像是一個包裹,須要什麼東西就往裏面裝什麼東西。
在Program.cs的Main方法中填寫代碼:
1 using (var db = new NewsContext()) 2 { 3 Console.Write("輸入新聞類型標題: "); 4 var name = Console.ReadLine(); 5 6 var type_Model = new NewType { Name = name }; 7 db.NewTypes.Add(type_Model); 8 db.SaveChanges(); 9 10 Console.WriteLine("查詢新聞類型標題:"); 11 var search_type = Console.ReadLine(); 12 var query = from b in db.NewTypes 13 where b.Name == search_type 14 select b; 15 16 Console.WriteLine("查詢結果:"); 17 foreach (var item in query) 18 { 19 Console.WriteLine(item.Name); 20 } 21 22 Console.ReadKey(); 23 }
上面代碼建立一個上下文對象實例,經過該實例添加一個新聞實體,而後經過輸入的值,linq查詢結果輸出。
經過上面的操做,咱們並無建立什麼鏈接字符串和數據庫操做,可是打開數據庫就能夠看到咱們經過Code First建立的數據庫了。
我當時作的時候,運行代碼沒有錯誤,可是用.\SQLEXPRESS和localhost登錄都看不到數據庫,安裝vs2012就給自動安裝了localdb,由於我本地沒 .\SQLEXPRESS,MSDN相關注解:
經過上面默認生成數據庫規則能夠看出,數據庫名是項目命名空間+上下文,有時候咱們須要本身定義生成數據庫名稱,或是生成數據庫到指定的服務器,並且有時候數據庫遷移了,咱們不能再從新生成一遍吧,這時候咱們就要自定義數據庫鏈接字符串了:
1 <connectionStrings> 2 <add name="NewContext" providerName="System.Data.SqlClient" connectionString="Server=.\SQLEXPRESS;Database=CodeFirstDemoDB;Trusted_Connection=true" /> 3 </connectionStrings>
須要注意的是:鏈接字符串的名稱必需要和上下文一致,並且connectionStrings必須放在configuration節點內的最下面,若是放在最上面會報下面這種錯誤:
咱們從新按照上面的操做運行程序,就能夠在指定的服務器.\SQLEXPRESS,生成指定的數據庫CodeFirstDemoDB。
關於Code First 遷移其實就是咱們在更改模型的時候,數據庫要相應的更改,打開工具-庫程序包管理器-程序包管理器控制檯。
1,例如咱們上面建立NewTypes表的時候,沒有指定字段的長度,默認是建立字段類型是nvarchar(MAX),有時候咱們以爲字段長度太長,須要修改一下字段長度,不要直接去修改數據庫,而是在模型中修改:
1 [MaxLength(50)] 2 public string Name { get; set; }
MaxLength就是上面咱們說到DataAnnotations命名空間下的類型,這邊咱們注意下,咱們在生成數據庫的時候添加了一條數據,Name字段值是「newtype one」,看看咱們修改字段長度後,字段值是否發生變化?
2,在程序包管理器控制檯輸入「Enable-Migrations」命令來啓用遷移,運行完成後在項目中會建立一個Migrations文件夾,下來有兩類文件:
須要注意的是:在咱們生成數據庫的時候,除了New和NewType表外,還有一個系統生成表__MigrationHistory,從表名上就能夠看出是遷移歷史記錄表。
3,在程序包管理器控制檯輸入「Add-Migration Update-NewType-Name」命令,Add-Migration表示增長一個遷移,後面是遷移名稱,這個咱們能夠隨便寫,運行後會自動檢測模型和數據庫發生的變化,在Migrations文件夾下會生成一個「201403290930423_Update-NewType-Name.cs」文件,打開咱們能夠看到更新內容:
1 public partial class UpdateNewTypeName : DbMigration 2 { 3 public override void Up() 4 { 5 AlterColumn("dbo.NewTypes", "Name", c => c.String(maxLength: 50)); 6 } 7 8 public override void Down() 9 { 10 AlterColumn("dbo.NewTypes", "Name", c => c.String()); 11 } 12 }
從上面能夠看出就是咱們上面修改模型的內容,固然你也能夠在這上面直接修改,好比你再加一個更新,能夠一塊兒提交到數據庫。
4,在程序包管理器控制檯輸入「Update-Database」命令,表示將全部的遷移應用到數據庫,打開數據庫,咱們看一下效果:
從上面能夠看出,字段Name的類型已經修改成nvarchar(50),並且字段值並無發生變化,能夠證實,Code First遷移並非刪除數據庫再建立。
Code First遷移除了上面說的字段類型修改還有不少內容,好比添加字段,刪除字段,刪除表等等,但都是大同小異,能夠觸類旁通。
下載地址:http://pan.baidu.com/s/1i3DS9b3
凡事貴在開始,更貴在堅持,與你共勉。。。
若是你以爲本篇文章對你有所幫助,請點擊右下部「推薦」,^_^