ASP.NET MVC4+EF4.1系列之三 Code First add-migration


這個系列自開始寫的時候終端很久了,沒辦法這段時間實在是太忙,無暇顧及啊。不過我在這里開始就給大家一個好的答復。希望以后時間能多點。 從系列三開始我開始講Code first add-migration 大家知道之前的model first雖然設計領域比較直觀和明了。但是有一個很大的缺陷,每次設計好領域后都需要重新去生成數據庫結構,然后導致數據的丟失,這個痛苦我想大家在用Model first 的時候都深有體會,那么我們慶幸我們有Code First 中的數據遷移足夠去為我們解決這些事問題了,讓我們即使改變領域但是我們依舊可以保持我們的配置數據(例如菜單配置)。

首先我們打開vs新建一個Egojit.Domain層,下一步就很重要了,我們打開Nuget如圖所示

 

在控制台輸入install-package entityframework 去安裝entityframework 默認安裝的是5.0如果出現如圖所示3.說明你安裝成功!它會給你自動加載entityframework庫.並且自動為項目添加packages.config配置包,代碼如下:

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="EntityFramework" version="5.0.0" targetFramework="net40" />
</packages>

這樣我們就為我們的項目加上了EF。而不需要手動去添加。

然后為我們的項目添加一個User類,我們這里只是為了測試EF code first add-migration.User代碼如下:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;

namespace Egojit.Domain
{
    public class User
    {
        [Key]
        public Guid Id { get; set; }

        public string Name { get; set; }

        public string Pwd { get; set; }
    }
}

比較簡單的代碼。但足夠我們去理解。

然后我們再為我們的項目添加Context類 EgojitFrameworkContext。代碼如下:

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Text;

namespace Egojit.Domain
{
    public class EgojitFrameworkContext:DbContext
    {
        public DbSet<User> Users { get; set; }
    }
}

這個EgojitFrameworkContext類需要繼承自DbContext,它就像一個容器去管理我們的領域各個類。

第四步我們需要配置數據庫,否則我們不知道數據庫生成到哪App.config文件的配置如下:

 

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <connectionStrings>
    <add name="EgojitFrameworkContext" connectionString="Data Source=.;Database=EgojitFramework;user Id=sa;pwd=2011623;MultipleActiveResultSets=true" providerName="System.Data.SqlClient" />
   
  </connectionStrings>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
  </entityFramework>
</configuration>

 

connectionStrings配置節很重要。這樣我們就可以去生成數據庫了,
第五步需要在Nuget控制台中執行 enable-migrations命令,在第一次的時候需要執行這個命令,以后修改了領域就不需要了如圖:

這樣會在項目中生成一個Migrations文件夾,並在這個文件夾中生成類Configuration。代碼如下:
namespace Egojit.Domain.Migrations
{
    using System;
    using System.Data.Entity;
    using System.Data.Entity.Migrations;
    using System.Linq;

    internal sealed class Configuration : DbMigrationsConfiguration<Egojit.Domain.EgojitFrameworkContext>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = false;
        }

        protected override void Seed(Egojit.Domain.EgojitFrameworkContext context)
        {
            //  This method will be called after migrating to the latest version.

            //  You can use the DbSet<T>.AddOrUpdate() helper extension method 
            //  to avoid creating duplicate seed data. E.g.
            //
            //    context.People.AddOrUpdate(
            //      p => p.FullName,
            //      new Person { FullName = "Andrew Peters" },
            //      new Person { FullName = "Brice Lambson" },
            //      new Person { FullName = "Rowan Miller" }
            //    );
            //
        }
    }
}

第六步我們執行add-migration db命令如圖:

這樣會生成領域結構變化的代碼:這個代碼類名稱是根據時間命名和我們執行add-migration命令時加的db去組合生成的。代碼是:
namespace Egojit.Domain.Migrations
{
    using System;
    using System.Data.Entity.Migrations;
    
    public partial class db : DbMigration
    {
        public override void Up()
        {
            CreateTable(
                "dbo.Users",
                c => new
                    {
                        Id = c.Guid(nullable: false),
                        Name = c.String(),
                        Pwd = c.String(),
                    })
                .PrimaryKey(t => t.Id);
            
        }
        
        public override void Down()
        {
            DropTable("dbo.Users");
        }
    }
}

我們從代碼中我們就可以看到我們的領域被改變了,而且被改變了什么。

最后一步我們需要在Nuget中執行update-database 命令將改變提交到我們配置的數據庫。

這樣我們就在數據庫中神奇的生成了EgojitFramework數據庫為什么叫這個名字,大家領悟下App.config配置文件就行了。同時也生成了Users表.如圖:

當然表中沒有數據,我們現在手動添加一條記錄:

這樣我們測試當我們修改了領域的時候是否數據會被清除。我們為User類添加一個Age字段。代碼如下:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;

namespace Egojit.Domain
{
    public class User
    {
        [Key]
        public Guid Id { get; set; }

        public string Name { get; set; }

        public string Pwd { get; set; }

        public int? age { get; set; }
    }
}

執行add-migration gg,然后update-database提交到數據庫。add-migration gg生成的代碼如下:

namespace Egojit.Domain.Migrations
{
    using System;
    using System.Data.Entity.Migrations;
    
    public partial class gg : DbMigration
    {
        public override void Up()
        {
            AddColumn("dbo.Users", "age", c => c.Int());
        }
        
        public override void Down()
        {
            DropColumn("dbo.Users", "age");
        }
    }
}

 

可以容易看出我們添加了age字段,我們刷新數據庫去查看如圖發現之前的數據保留了:

好了就到這里。add-migraion大功告成,以后修改領域就不用怕了,我們只需要兩條命令就OK了。

版權聲明:出自梔子網http://www.zhizinet.com




 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM