Entity Framework Code First資料庫連線

libingql發表於2013-10-04

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>();
        }
    }
}

相關文章