天天看點

初試Code First(附Demo)

寫在前面

  1. 建立項目
  2. 安裝EntityFramework程式包
  3. 建立模型
  4. 建立上下文DbContext
  5. 建立資料庫、讀/寫資料
  6. 配置連接配接字元串
  7. Code First 遷移
  8. 示例Demo下載下傳
  9. 後記

  以前逛園子的時候,很多大牛寫的一些東西,什麼AOP、DDD之類的,看過之後一頭霧水,遠望大牛,回過頭看看自己,原來程式員的差距還可以這麼大。每個程式員都有個大牛夢想,當然小菜我也是,隻是還在開始的路上。

  因為前幾天研究easyui,準備寫個mvc+ef+easyui的簡單示例,當然這對很多人來說很簡單,有段時間也研究過别人寫的,但這是小菜我第一次自己寫,勿噴。而且這周安排給自己的任務:設計模式第五篇-控制反轉(ioc),前段時間做些其他方面的事,設計模式也好久沒寫了,是以這周必須把它完成,想研究完ioc之後,試着再寫上面的簡單示例,把ioc融入到mvc中,想想應該有搞頭。

  關于Code First,昨晚無意間看到一位園友翻譯的相關教程:http://www.cnblogs.com/qouoww/archive/2011/12/31/2309066.html,這邊小弟先謝過,前面幾篇還可以看下去,但是後面幾篇就有點不知所雲了,學習是一方面,實踐是另一方面,做的過程中才能學到更多的東西,這邊也試着寫個關于Code First的小示例。

  自己動手,豐衣足食。

  我使用的是vs2012,如果使用vs2010需要安裝NuGet。

Nuget是一個.NET平台下的開源的項目,它是Visual Studio的擴充。在使用Visual Studio開發基于.NET Framework的應用時,Nuget能把在項目中添加、移除和更新引用的工作變得更加快捷友善。

  建立-項目-Visual C#-windows-控制台應用程式,命名為:CodeFirstDemo。

  這邊需要注意的是:選擇.net framework的時候要4.0以上版本,要不然下面NuGet安裝EntityFramework擴充的時候會報建立項目版本底無法完成安裝的錯誤,.net framework改成4.0就可以了,但是換了一台電腦3.5版本測試安裝又是好的,不知是個什麼情況,反正.net framework版本最好選擇4.0以上。

  建立好CodeFirstDemo項目後,我們先來安裝EntityFramework,項目-管理NuGet程式包-聯機-搜尋“EntityFramework”,下載下傳安裝。

  安裝完成後會在項目下自動添加EntityFramework引用:

初試Code First(附Demo)

  在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(附Demo)

  通過上面的操作,我們并沒有建立什麼連接配接字元串和資料庫操作,但是打開資料庫就可以看到我們通過Code First建立的資料庫了。

初試Code First(附Demo)

  我當時做的時候,運作代碼沒有錯誤,但是用.\SQLEXPRESS和localhost登陸都看不到資料庫,安裝vs2012就給自動安裝了localdb,因為我本地沒 .\SQLEXPRESS,MSDN相關注解:

  • 如果本地 SQL Express 執行個體可用(預設情況下随 Visual Studio 2010 安裝),則 Code First 已對該執行個體建立了資料庫
  • 如果 SQL Express 不可用,則 Code First 将嘗試使用 LocalDb(預設情況下随 Visual Studio 2012 安裝)

  通過上面預設生成資料庫規則可以看出,資料庫名是項目命名空間+上下文,有時候我們需要自己定義生成資料庫名稱,或是生成資料庫到指定的伺服器,而且有時候資料庫遷移了,我們不能再重新生成一遍吧,這時候我們就要自定義資料庫連接配接字元串了:

1   <connectionStrings>
2     <add name="NewContext" providerName="System.Data.SqlClient" connectionString="Server=.\SQLEXPRESS;Database=CodeFirstDemoDB;Trusted_Connection=true" />
3   </connectionStrings>      

  需要注意的是:連接配接字元串的名稱必須要和上下文一緻,而且connectionStrings必須放在configuration節點内的最下面,如果放在最上面會報下面這種錯誤:

初試Code First(附Demo)

  我們重新按照上面的操作運作程式,就可以在指定的伺服器.\SQLEXPRESS,生成指定的資料庫CodeFirstDemoDB。

初試Code First(附Demo)

  關于Code First 遷移其實就是我們在更改模型的時候,資料庫要相應的更改,打開工具-庫程式包管理器-程式包管理器控制台。

初試Code First(附Demo)

  1,例如我們上面建立NewTypes表的時候,沒有指定字段的長度,預設是建立字段類型是nvarchar(MAX),有時候我們覺得字段長度太長,需要修改一下字段長度,不要直接去修改資料庫,而是在模型中修改:

1         [MaxLength(50)]
2         public string Name { get; set; }      

  MaxLength就是上面我們說到DataAnnotations命名空間下的類型,這邊我們注意下,我們在生成資料庫的時候添加了一條資料,Name字段值是“newtype one”,看看我們修改字段長度後,字段值是否發生變化?

  2,在程式包管理器控制台輸入“Enable-Migrations”指令來啟用遷移,運作完成後在項目中會建立一個Migrations檔案夾,下來有兩類檔案:

初試Code First(附Demo)
  • Configuration.cs — 此檔案包含“遷移”将用來遷移 BloggingContext 的設定。在本演練中不需要進行任何更改,但是,在此處可以指定種子資料、為其他資料庫注冊提供程式、更改生成遷移的命名空間等。
  • <時間戳>_InitialCreate.cs — 這是第一個遷移,它表示已經應用于資料庫的更改。應用更改的目的是将其從空資料庫遷移至包含部落格和文章表的資料庫。盡管我們讓 Code First 自動建立這些表,現在我們選擇“遷移”(已轉化為一次“遷移”)。Code First 還在本地資料庫中記錄:該“遷移”已經應用。檔案名中的時間戳用于排序。

  需要注意的是:在我們生成資料庫的時候,除了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”指令,表示将所有的遷移應用到資料庫,打開資料庫,我們看一下效果:

初試Code First(附Demo)

  從上面可以看出,字段Name的類型已經修改為nvarchar(50),而且字段值并沒有發生變化,可以證明,Code First遷移并不是删除資料庫再建立。

  Code First遷移除了上面說的字段類型修改還有很多内容,比如添加字段,删除字段,删除表等等,但都是大同小異,可以舉一反三。

  下載下傳位址:http://pan.baidu.com/s/1i3DS9b3

  凡事貴在開始,更貴在堅持,與你共勉。。。

  如果你覺得本篇文章對你有所幫助,請點選右下部“推薦”,^_^

作者:田園裡的蟋蟀

微信公衆号:你好架構

出處:http://www.cnblogs.com/xishuai/

公衆号會不定時的分享有關架構的方方面面,包含并不局限于:Microservices(微服務)、Service Mesh(服務網格)、DDD/TDD、Spring Cloud、Dubbo、Service Fabric、Linkerd、Envoy、Istio、Conduit、Kubernetes、Docker、MacOS/Linux、Java、.NET Core/ASP.NET Core、Redis、RabbitMQ、MongoDB、GitLab、CI/CD(持續內建/持續部署)、DevOps等等。

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接。

分享到:

QQ空間

新浪微網誌

騰訊微網誌

微信

更多

繼續閱讀