1. <td id="dzoci"></td>
          <style id="dzoci"></style>
      2. 濟(jì)寧果殼科技專業(yè)軟件開(kāi)發(fā)團(tuán)隊(duì),提供全方位的互聯(lián)網(wǎng)服務(wù)!
        座機(jī):15563775221 手機(jī):15563775221(微信)

        熱門(mén)標(biāo)簽

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

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

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

        濟(jì)寧果殼科技

        2017-08-12 18:47:24

        88

        5697

        1. 安裝Entity Framework

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

        PM> Install-Package EntityFramework

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

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











        
        

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

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



        providerName="System.Data.SqlClient" />

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

        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ù)庫(kù)的初始化方式,在構(gòu)造函數(shù)中指定App.config的connectionString。

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

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

        1>. CreateDatabaseIfNotExists

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

        Database.SetInitializer(new CreateDatabaseIfNotExists());

        2>. DropCreateDatabaseWhenModelChanges

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

        Database.SetInitializer(new DropCreateDatabaseIfModelChanges());

        3>. DropCreateDatabaseAlways

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

        Database.SetInitializer(new DropCreateDatabaseAlways());

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

        Database.SetInitializer(null);

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

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

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

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

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

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

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

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

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

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

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


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

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            // 禁用默認(rèn)表名復(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)
                {
                    // 禁用默認(rèn)表名復(fù)數(shù)形式
                    modelBuilder.Conventions.Remove();
                    // 禁用一對(duì)多級(jí)聯(lián)刪除
                    modelBuilder.Conventions.Remove();
                    // 禁用多對(duì)多級(jí)聯(lián)刪除
                    modelBuilder.Conventions.Remove();
                }
            }
        }
        4、Code-First數(shù)據(jù)遷移

        啟動(dòng)數(shù)據(jù)遷移

        打開(kāi)程序包管理器控制臺(tái),輸入Enable-Migrations指令,以MvcMigrationDemoContext為例,輸入如下:

        Enable-Migrations -ContextTypeName MvcMigrationDemo.Models.MvcMigrationDemoContext

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

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

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

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

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

        進(jìn)行遷移動(dòng)作 在PM中輸入U(xiǎn)pdate-Database指令

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

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

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

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

        關(guān)閉咨詢框
        国产交换配偶在线视频,豆国产97在线 | 亚洲,亚洲国产第一福利一区二区,在线视频免费国产午夜 国产在线不卡每日更新福利 国产无码一二三专区

            1. <td id="dzoci"></td>
                <style id="dzoci"></style>