• <b id="9c8ir"><menuitem id="9c8ir"></menuitem></b>

  • 濟寧果殼科技專業(yè)軟件開發(fā)團隊,提供全方位的互聯(lián)網(wǎng)服務(wù)!
    座機:15563775221 手機:15563775221(微信)

    熱門標簽

    1. 首頁
    2. 果殼學(xué)院
    3. 技術(shù)顧問
    4. EF Code-First數(shù)據(jù)遷移 配置技巧及命令說明
    EF Code-First數(shù)據(jù)遷移  配置技巧及命令說明

    EF Code-First數(shù)據(jù)遷移 配置技巧及命令說明

    EF Code-First數(shù)據(jù)遷移 配置技巧及命令說明;Entity Framework Code First數(shù)據(jù)庫連接;Code-First數(shù)據(jù)遷移

    濟寧果殼科技

    2017-08-12 18:47:24

    88

    7074

    1. 安裝Entity Framework

    使用NuGet安裝Entity Framework程序包:工具->庫程序包管理器->程序包管理器控制臺,執(zhí)行以下語句:

    PM> Install-Package EntityFramework

    2. Entity Framework數(shù)據(jù)庫連接配置

    安裝了Entity Framework之后,會自動添加App.config 文件。該文件中配置了Entity Framework的DefaultConnectionFactory,修改數(shù)據(jù)庫連接字符串之后的連接具體如下:











    
    

    在進行上面的為Entity Framework設(shè)置DefaultConnectionFactory之后,使用Entity Framework連接數(shù)據(jù)庫不需再在其他地方進行設(shè)置,Entity Framework也不需要指定數(shù)據(jù)庫連接。

    Entity Framework連接數(shù)據(jù)庫除了以上的方式,也可以通過配置常用的connectionStrings,修改App.config如下:



    providerName="System.Data.SqlClient" />

    3. Entity Framework DbContext連接數(shù)據(jù)庫

    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(null);
                //Database.SetInitializer(new CreateDatabaseIfNotExists());
                //Database.SetInitializer(new DropCreateDatabaseAlways());
                //Database.SetInitializer(new DropCreateDatabaseIfModelChanges());
            }
    
            public PortalContext()
                : base("name=PortalContext")
            {
            }
    
            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
            }
        }
    }

    在PortalContext.cs中,使用了類的靜態(tài)構(gòu)造函數(shù)及構(gòu)造函數(shù)。其中,在靜態(tài)構(gòu)造函數(shù)中設(shè)置數(shù)據(jù)庫的初始化方式,在構(gòu)造函數(shù)中指定App.config的connectionString。

    3.1 Entity Framework數(shù)據(jù)庫初始化方式

    Entity Framework通過Database.SetInitializer來指定需要的數(shù)據(jù)庫初始化方式,Database.SetInitializer可指定的數(shù)據(jù)庫共有3種:

    1>. CreateDatabaseIfNotExists

    CreateDatabaseIfNotExists是Database.SetInitializer指定數(shù)據(jù)庫的默認方式,用于當(dāng)數(shù)據(jù)庫不存在時,自動創(chuàng)建數(shù)據(jù)庫。由于該方式是默認方式,所以可以不需要任何代碼進行指定,當(dāng)然也可以使用代碼來明確的指定。

    Database.SetInitializer(new CreateDatabaseIfNotExists());

    2>. DropCreateDatabaseWhenModelChanges

    DropCreateDatabaseWhenModelChanges用于當(dāng)數(shù)據(jù)模型發(fā)生改變時,先刪除原數(shù)據(jù)庫,后創(chuàng)建新的數(shù)據(jù)庫。

    Database.SetInitializer(new DropCreateDatabaseIfModelChanges());

    3>. DropCreateDatabaseAlways

    DropCreateDatabaseAlways用于每次均先刪除原數(shù)據(jù)庫再創(chuàng)建新的數(shù)據(jù)庫,不管數(shù)據(jù)模型是否發(fā)生改變。

    Database.SetInitializer(new DropCreateDatabaseAlways());

    但是,在很多時候,我們希望即使在Entity Framework Code First與數(shù)據(jù)庫不匹配時,寧可Entity Framework Code First報出數(shù)據(jù)庫連接錯誤,而不希望對數(shù)據(jù)庫進行任何的刪除創(chuàng)建操作。Entity Framework Code First提供關(guān)閉數(shù)據(jù)庫初始化操作:

    Database.SetInitializer(null);

    3.2 Entity Framework Code First連接數(shù)據(jù)庫的一些設(shè)置

    在實際使用Entity Framework Code First來操作數(shù)據(jù)庫時,通常會在繼承DbContext的類中作一些Entity Framework Code First的數(shù)據(jù)庫操作設(shè)置。

    1>. 禁用延遲加載(Lazy Loading)

    在存在引用關(guān)系的兩個實體類中,一個類的實例可以通過關(guān)聯(lián)關(guān)系獲取與之對應(yīng)的另外一個類的一個或多個實例。在這種獲取的時候,Entity Framework Code First提供了默認的延遲加載功能。一個類的實例,在需要使用另外一個類對應(yīng)的實例時,可以直接讀取在類中定義的關(guān)聯(lián)屬性,Entity Framework將自動到數(shù)據(jù)庫中去讀取返回需要的記錄。當(dāng)然這是延遲加載的好處,同樣延遲加載也存在一些不好的地方。在Entity Framework通過延遲加載去讀取關(guān)聯(lián)記錄時,可能執(zhí)行過多的SQL語句,與實際所預(yù)想的不一致,從而影響代碼的執(zhí)行效率。

    設(shè)置默認禁用延遲加載,在需要Entity Framework讀取關(guān)聯(lián)數(shù)據(jù)記錄時采用顯示加載。

    public PortalContext()
        : base("name=PortalContext")
    {
        // 禁用延遲加載
        this.Configuration.LazyLoadingEnabled = false;
    }

    2>. 禁用關(guān)系數(shù)據(jù)的級聯(lián)刪除

    在存在關(guān)聯(lián)關(guān)系的數(shù)據(jù)記錄間,當(dāng)主表記錄被刪除時,自動刪除從表中關(guān)聯(lián)的記錄。這個是關(guān)系數(shù)據(jù)庫中大都存在的功能,包括MS SQL Server同樣也提供了該功能。然而在實際的項目中,往往不想使用這種級聯(lián)刪除功能,在需要刪除關(guān)聯(lián)的記錄時,也一樣編寫代碼來進行刪除。

    Entity Framework Code First設(shè)置默認禁用關(guān)聯(lián)數(shù)據(jù)的級聯(lián)刪除功能:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        // 禁用一對多級聯(lián)刪除
        modelBuilder.Conventions.Remove();
        // 禁用多對多級聯(lián)刪除
        modelBuilder.Conventions.Remove();
    }

    3>. 禁用默認表名復(fù)數(shù)形式


    Entity Framework Code First在根據(jù)類名來生成數(shù)據(jù)表時,生成的數(shù)據(jù)表表名會是類名的復(fù)數(shù)形式。

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        // 禁用默認表名復(fù)數(shù)形式
        modelBuilder.Conventions.Remove();
    }
    
    ;

    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(null);
            }
            public PortalContext()
                : base("name=PortalContext")
            {
                // 禁用延遲加載
                this.Configuration.LazyLoadingEnabled = false;
            }
            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                // 禁用默認表名復(fù)數(shù)形式
                modelBuilder.Conventions.Remove();
                // 禁用一對多級聯(lián)刪除
                modelBuilder.Conventions.Remove();
                // 禁用多對多級聯(lián)刪除
                modelBuilder.Conventions.Remove();
            }
        }
    }
    4、Code-First數(shù)據(jù)遷移

    啟動數(shù)據(jù)遷移

    打開程序包管理器控制臺,輸入Enable-Migrations指令,以MvcMigrationDemoContext為例,輸入如下:

    Enable-Migrations -ContextTypeName MvcMigrationDemo.Models.MvcMigrationDemoContext

    VS 會創(chuàng)建一個Migrations目錄,包含兩個文檔**********_InitialCreate和Configuration。

    你會發(fā)現(xiàn)**********_InitialCreate剛好和[dbo].[__MigrationHistory].MigrationId一致,文檔記錄了創(chuàng)建本次數(shù)據(jù)模型的完整描述。

    Configuration定義了數(shù)據(jù)庫遷移該有的行為。

    4.1、運行數(shù)據(jù)庫遷移

    在PM中,輸入Add-Migration指令,必須帶上一個版本名稱。

    進行遷移動作 在PM中輸入Update-Database指令

    到此,數(shù)據(jù)遷移完成。

    附1:可通過Update-Database指令自動生成數(shù)據(jù)庫遷移的T-SQL腳本,本次操作如下:Update-Database -SourceMigration *********_InitialCreate -TargetMigration **********_AddAbout -Script

    附2:還原數(shù)據(jù)庫  本次操作如下:Update-Database -TargetMigration **********_InitialCreate

    定制首選 果殼科技 咨詢熱線:0537-2551991

    關(guān)閉咨詢框
    国内精品九九久久精品一本,亚洲制服类中文字幕,免费的国产成人片,蜜臀 色欲国产av在精品
  • <b id="9c8ir"><menuitem id="9c8ir"></menuitem></b>

  • 国产精品视频播放更新| 久久国内中文字幕| 欧美一区二区三区视頻免費| 国产区一区二区三区高清| av三级国产A级水| 亚洲国产高清自产拍| 免费国产va在线观看中文字| 人妻一级无码中文字幕| 久久丝袜脚交免费播放| 国产精品欧美激情aaaa| 欧美一级三级片一区二区| 国产一区二区视频在线观看| 亚洲日求啪啪免费观看视频| 日本韩国亚洲一区二区女| 久久99亚洲5精品片片| 91精品国产自产在线| 精品免费在线观看| 亚洲无码变态在线观看视频| 亚洲精品线路一在线观看|