寫一個EF的CodeFirst的Demo
今天打算寫一個關於EF的CodeFirs的一個小Demo.先略說一個EF的三種與數據庫,怎么說,叫映射么,好吧,那就這么叫吧,就是一個是ModelFirst就是是在模型先行,直接在VS里添加模型然后再加入(或者說是映射)到數據庫中,一個是DBFirst就是數據庫先行,先在數據庫中設計表等.最后一個就是CodeFirst或者就確切的是叫CodeOnly,就是只寫代碼就可以了.不用在數據庫里設計表也不用在VS里設計模型.就可以做到只寫代碼就可以設計數據庫了.依舊如是,我寫的都是很簡單的東西,大牛神馬的自然可以路過不看,另外小伙子我貌似需要鼓勵的節奏,如若不喜,磚頭還請不要扔太多的節奏.願共同進步.
CodeFirst總的來說是分為兩步,第一步就是創建實體,第二步就是創建EF的上下文.
那么最開始呢,我們是創建一個項目,然后引進EF的一些程序集,有了此程序集才能有一些EF的操作,比如當我們寫創建EF的上下文的時候有了此程序集才能繼承DbContext.第一種引用的方法自然是我們平時的點引用,然后找或者瀏覽什么的引用進來,我這里就不這么找了,使一個小招,就是我們可以在這個項目中創建一個空的ADO.NET實體模型,自然是創建一個空的就行了.如若需要圖可參見我的上一篇文章,關於EF+MVC的一個快速CRUD的文章.的第四幅圖和第五幅圖,只是第五幅圖選擇空的實體模型.如此則會自動將我們所需要的程序集引進來.那么可以對比一下:
這是沒引程序集的圖:
下面就是引入了程序集的圖(其中Model.edmx是可以刪除掉的,因為它已經沒有什么價值了):
接着就創建兩個類,一個UserInfo類和一個Order類.其代碼如下:

1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel.DataAnnotations; 4 using System.Linq; 5 using System.Text; 6 using System.Threading.Tasks; 7 8 namespace EFCodeFirstDemo1 9 { 10 public class UserInfo 11 { 12 [Key] 13 public int Id { get; set; } 14 public string Name { get; set; } 15 //一個可以有多個訂單 16 public ICollection<Order> Orders { get; set; } 17 } 18 }

1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel.DataAnnotations; 4 using System.Linq; 5 using System.Text; 6 using System.Threading.Tasks; 7 8 namespace EFCodeFirstDemo1 9 { 10 public class Order 11 { 12 [Key] 13 public int Id { get; set; } 14 public string Context { get; set; } 15 //一個訂單只能有一個用戶 16 public UserInfo UserInfo { get; set; } 17 } 18 }
感覺如果電腦ROM有4G可以考慮裝上一個ReSharper的一個插件,是有利於開發的,比如當這兩個類要給主鍵Id加上標簽的時候,它會自動提醒我們要引什么,而我們要做的就是點一下就可以了引進了.也就是這樣:
那么第一步創建實體就完成了.現在就是第二步了.創建上下文.創建上下文我們就寫一個上下文的類,讓之繼承與DbContext,寫一下這個類的構造函數,將value傳進去,其中value就是配置文件中的連接數據庫代碼和一個關於驅動的一個代碼.略要注意下其中對應關系.接着將實體放到集合里就可以了.其代碼如下:

1 using System; 2 using System.Collections.Generic; 3 using System.Data.Entity; 4 using System.Linq; 5 using System.Text; 6 using System.Threading.Tasks; 7 8 namespace EFCodeFirstDemo1 9 { 10 public class DemoDbContext:DbContext 11 { 12 public DemoDbContext() : base("name=Demo")//此與配置文件相對應. 13 { 14 15 } 16 public DbSet<UserInfo> UserInfo { get; set; } 17 public DbSet<Order> Orders { get; set; } 18 } 19 }
配置文件中的代碼如下:

1 <?xml version="1.0" encoding="utf-8"?> 2 <configuration> 3 <configSections> 4 <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> 5 <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 6 </configSections> 7 <startup> 8 <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> 9 </startup> 10 <entityFramework> 11 <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" /> 12 </entityFramework> 13 14 <!--以下三行這就是自己寫的配置文件,其要位於section下.不可改在其上面的--> 15 <connectionStrings> 16 <add name="Demo" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=Cnbolgs;Integrated Security=True;" providerName="System.Data.SqlClient"/> 17 </connectionStrings> 18 19 </configuration>
在主函數里創建一個數據庫,給表加點字段,測試一下成功了沒.

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace EFCodeFirstDemo1 8 { 9 class Program 10 { 11 static void Main(string[] args) 12 { 13 //創建上下文 14 DemoDbContext db = new DemoDbContext(); 15 //創建數據庫 16 db.Database.CreateIfNotExists(); 17 //創建表且將字段加入進去 18 UserInfo userInfo = new UserInfo(); 19 userInfo.Name = "du"; 20 //將表加入到數據庫中 21 db.UserInfo.Add(userInfo); 22 //保存之 23 db.SaveChanges(); 24 Console.WriteLine("成功創建數據庫和表"); 25 Console.ReadKey(); 26 } 27 } 28 }
運行,等了一會,我們終於看到了這句話:
然后查一個數據庫,看下數據庫中有沒有相應的表和字段.結果是成功了的.因為:
那么,這個DEMO算是成功的完成了.感覺寫博客有點累的感覺.歡迎多提意見,共同進步.