1. 安裝Entity Framework
使用NuGet安裝Entity Framework程序包:工具->庫程序包管理器->程序包管理器控制台,執行以下語句:
PM> Install-Package EntityFramework
2. Entity Framework數據庫連接配置
安裝了Entity Framework之后,會自動添加App.config 文件。該文件中配置了Entity Framework的DefaultConnectionFactory,修改數據庫連接字符串之后的連接具體如下:
<?xml version="1.0" encoding="utf-8"?> <configuration> <configSections> <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> </configSections> <entityFramework> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework"> <parameters> <parameter value="Data Source=(local); Database=Portal; User ID=sa; Password=; MultipleActiveResultSets=True" /> </parameters> </defaultConnectionFactory> </entityFramework> </configuration>
在進行上面的為Entity Framework設置DefaultConnectionFactory之后,使用Entity Framework連接數據庫不需再在其他地方進行設置,Entity Framework也不需要指定數據庫連接。
Entity Framework連接數據庫除了以上的方式,也可以通過配置常用的connectionStrings,修改App.config如下:
<?xml version="1.0" encoding="utf-8"?> <configuration> <connectionStrings> <add name="PortalContext" connectionString="Data Source=(local); Database=Portal; User ID=sa; Password=; MultipleActiveResultSets=True" providerName="System.Data.SqlClient" /> </connectionStrings> </configuration>
3. Entity Framework DbContext連接數據庫
新建類文件PortalContext.cs,具體代碼:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.Entity; namespace Portal { public class PortalContext : DbContext { static PortalContext() { Database.SetInitializer<PortalContext>(null); //Database.SetInitializer(new CreateDatabaseIfNotExists<PortalContext>()); //Database.SetInitializer(new DropCreateDatabaseAlways<PortalContext>()); //Database.SetInitializer(new DropCreateDatabaseIfModelChanges<PortalContext>()); } public PortalContext() : base("name=PortalContext") { } protected override void OnModelCreating(DbModelBuilder modelBuilder) { } } }
在PortalContext.cs中,使用了類的靜態構造函數及構造函數。其中,在靜態構造函數中設置數據庫的初始化方式,在構造函數中指定App.config的connectionString。
3.1 Entity Framework數據庫初始化方式
Entity Framework通過Database.SetInitializer來指定需要的數據庫初始化方式,Database.SetInitializer可指定的數據庫共有3種:
1>. CreateDatabaseIfNotExists
CreateDatabaseIfNotExists是Database.SetInitializer指定數據庫的默認方式,用於當數據庫不存在時,自動創建數據庫。由於該方式是默認方式,所以可以不需要任何代碼進行指定,當然也可以使用代碼來明確的指定。
Database.SetInitializer(new CreateDatabaseIfNotExists<PortalContext>());
2>. DropCreateDatabaseWhenModelChanges
DropCreateDatabaseWhenModelChanges用於當數據模型發生改變時,先刪除原數據庫,后創建新的數據庫。
Database.SetInitializer(new DropCreateDatabaseIfModelChanges<PortalContext>());
3>. DropCreateDatabaseAlways
DropCreateDatabaseAlways用於每次均先刪除原數據庫再創建新的數據庫,不管數據模型是否發生改變。
Database.SetInitializer(new DropCreateDatabaseAlways<PortalContext>());
但是,在很多時候,我們希望即使在Entity Framework Code First與數據庫不匹配時,寧可Entity Framework Code First報出數據庫連接錯誤,而不希望對數據庫進行任何的刪除創建操作。Entity Framework Code First提供關閉數據庫初始化操作:
Database.SetInitializer<PortalContext>(null);
3.2 Entity Framework Code First連接數據庫的一些設置
在實際使用Entity Framework Code First來操作數據庫時,通常會在繼承DbContext的類中作一些Entity Framework Code First的數據庫操作設置。
1>. 禁用延遲加載(Lazy Loading)
在存在引用關系的兩個實體類中,一個類的實例可以通過關聯關系獲取與之對應的另外一個類的一個或多個實例。在這種獲取的時候,Entity Framework Code First提供了默認的延遲加載功能。一個類的實例,在需要使用另外一個類對應的實例時,可以直接讀取在類中定義的關聯屬性,Entity Framework將自動到數據庫中去讀取返回需要的記錄。當然這是延遲加載的好處,同樣延遲加載也存在一些不好的地方。在Entity Framework通過延遲加載去讀取關聯記錄時,可能執行過多的SQL語句,與實際所預想的不一致,從而影響代碼的執行效率。
設置默認禁用延遲加載,在需要Entity Framework讀取關聯數據記錄時采用顯示加載。
public PortalContext() : base("name=PortalContext") { // 禁用延遲加載 this.Configuration.LazyLoadingEnabled = false; }
2>. 禁用關系數據的級聯刪除
在存在關聯關系的數據記錄間,當主表記錄被刪除時,自動刪除從表中關聯的記錄。這個是關系數據庫中大都存在的功能,包括MS SQL Server同樣也提供了該功能。然而在實際的項目中,往往不想使用這種級聯刪除功能,在需要刪除關聯的記錄時,也一樣編寫代碼來進行刪除。
Entity Framework Code First設置默認禁用關聯數據的級聯刪除功能:
protected override void OnModelCreating(DbModelBuilder modelBuilder) { // 禁用一對多級聯刪除 modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>(); // 禁用多對多級聯刪除 modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>(); }
3>. 禁用默認表名復數形式
Entity Framework Code First在根據類名來生成數據表時,生成的數據表表名會是類名的復數形式。
protected override void OnModelCreating(DbModelBuilder modelBuilder) { // 禁用默認表名復數形式 modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); }
最后附上本篇隨筆中PortalContext.cs的完整代碼:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.Entity; using System.Data.Entity.ModelConfiguration.Conventions; namespace Portal { public class PortalContext : DbContext { static PortalContext() { Database.SetInitializer<PortalContext>(null); } public PortalContext() : base("name=PortalContext") { // 禁用延遲加載 this.Configuration.LazyLoadingEnabled = false; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { // 禁用默認表名復數形式 modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); // 禁用一對多級聯刪除 modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>(); // 禁用多對多級聯刪除 modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>(); } } }