MVC學習6 學習使用Code First Migrations功能 把Model的更新同步到DB中

來源:互聯網
上載者:User

標籤:

 參考:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-a-new-field-to-the-movie-model-and-table

轉:http://www.it165.net/pro/html/201403/10653.html

本文內容:

1,學習Entity Framework Code First 移轉功能(Migrations)

2,更新Model Class(Model Class中添加新的欄位),然後把更新應用於datebase.

預設情況下,就像我們之前用Models下的movie.cs右鍵點擊直接添加database的時候,Code First自動在資料庫中添加新的表來記錄新添加的database時候和movie.cs同步,如果不同步,Entity Framework就會跑出錯誤。這樣我們就可以在開發的過程中發現錯誤,而不是必須在啟動並執行時候才發現錯誤。

一,為Model的改變設定Code First Migrations功能(Setting up Code First Migrations for Model Changes),從而可以讓movie.cs改變的時候,把改變應用於Database(Model類和自動產生的資料庫同步)

1,1刪除MovieDBContext,刪除.mdf檔案

1.2Ctrl+Shift+B重建解決方案後,開啟“套件管理器控制台”:

PM>提示符後面執行Enable-Migrations命令開啟Code First Migrations功能,我們現在直接輸入:Enable-Migrations,可以看到提示命令:

我們需要Enable的是Movie,直接Copy提示命令中的下面的一行命令:

Enable-Migrations -ContextTypeName MvcMovie.Models.MovieDBContext 開啟成功:

解決方案下建立了Migrations檔案夾:

1.3,更改Configuration.cs中的寫Seed方法,開啟Configuration.cs,我們看到

protected override void Seed(MVCMovie.Models.MovieDBContext context)         {             //這個方法將會在Migrations後被調用             //  This method will be called after migrating to the latest version.
            //你可以用DbSet<T>的.AddOrUpdate擴充方法,避免建立重複的資料             //  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‘ }             //    );             //         }View Code

更新Seed方法:

protected override void Seed(MvcMovie.Models.MovieDBContext context) {     context.Movies.AddOrUpdate( i => i.Title,         new Movie         {             Title = ‘When Harry Met Sally‘,             ReleaseDate = DateTime.Parse(‘1989-1-11‘),             Genre = ‘Romantic Comedy‘,             Price = 7.99M         },
         new Movie          {              Title = ‘Ghostbusters ‘,              ReleaseDate = DateTime.Parse(‘1984-3-13‘),              Genre = ‘Comedy‘,              Price = 8.99M          },
         new Movie          {              Title = ‘Ghostbusters 2‘,              ReleaseDate = DateTime.Parse(‘1986-2-23‘),              Genre = ‘Comedy‘,              Price = 9.99M          },
       new Movie        {            Title = ‘Rio Bravo‘,            ReleaseDate = DateTime.Parse(‘1959-4-15‘),            Genre = ‘Western‘,            Price = 3.99M        }    );     }View Code

添加引用:

Code First Migrations 在每一次migration之後都會調用這個Seed方法,從而更新Database中的資料(Insert orUpdate) 1,4重建解決方案。為Migrations建立一個新的DbMigration.cs類繼承自DbMigration,這一步將會建立一個Database,這就是我們之前要刪除movie.mdf的原因. 在Package Manager Console中執行命令:add-migration Initial  產生 intial migration. “intial”是任意命名的,用來命名建立的migration檔案。這個類是用來建立新的資料庫

Code First 建立了一個帶有時間戳記的_Initial.cs,這個類中的代碼實現了建立資料庫表,當你更新類中的表的時候,_Initial.cs將會運行更新dabatbase中的表,然後Seed方法填充測試資料到Database的Table中。這些遷移檔案類檔案都是以時間戳記為首碼命名並排序的:

  public partial class Initial : DbMigration     {         public override void Up()         {             CreateTable(                 ‘dbo.Movies‘,                 c => new                     {                         ID = c.Int(nullable: false, identity: true),                         Title = c.String(),                         ReleaseDate = c.DateTime(nullable: false),                         Genre = c.String(),                         Price = c.Decimal(nullable: false, precision: 18, scale: 2),                     })                 .PrimaryKey(t => t.ID);                      }                  public override void Down()         {             DropTable(‘dbo.Movies‘);         }     }View Code

現在我們運行命令PM>update-datebase 來建立資料庫,運行Seed方法:

如果運行update-database方法的時提示Table已經存在,是因為你在刪除表之後運行了項目。如果是這樣再次把Movie.mdf刪除,然後執行update-datebase命令。如果還是報錯,刪除Migrations檔案夾,然後從上面刪除Movie.mdf處重新按照本文介紹的一步一步來。

Ctrl+F5執行程式,我們看到了Seed方法中的資料:

二,在Movie Model中添加新的屬性欄位,把欄位同步到DB的Table中

namespace MVCMovie.Models {     //Moive 類就相當於資料庫中的一張名為Movie的Table     //Movie 類執行個體化的對象相當於Table中的一行,執行個體的各個屬性(ID,Title...)相當於Table中的列     public class Movie     {         public int ID { get; set; }         public string Title { get; set; }         public DateTime ReleaseDate { get; set; }         public string Genre { get; set; }         public decimal Price { get; set; }
        public string Rating { get; set; }     }     //MovieDBContext class ,繼承自Entity Framework中的DbContext,代表這Movie資料內容     //MovieDBContext class ,讀取、儲存、更新Movie Class 執行個體     public class MovieDBContext : DbContext      {         public DbSet<Movie> Movies { get; set; }     } }View Code

Ctrl+Shift+B重建解決方案,然後在View中的各個頁面添加Rating屬性:

   <div class=‘editor-label‘>             @Html.LabelFor(model => model.Rating)         </div>         <div class=‘editor-field‘>             @Html.EditorFor(model => model.Rating)             @Html.ValidationMessageFor(model => model.Rating)         </div>View Code

Ctrl+F5運行程式,提示如下:

這是因為我們剛剛在Model中的Movie.cs中添加了新的屬性欄位,Movie.cs中的欄位和已經存在的Database中的表欄位不一致:

我們用Code First Migrations來解決這個問題: 1,在Seed中的每一個對象執行個體中添加 Rating= ‘G‘,如:

   context.Movies.AddOrUpdate(i => i.Title,         new Movie         {             Title = ‘When Harry Met Sally‘,             ReleaseDate = DateTime.Parse(‘1989-1-11‘),             Genre = ‘Romantic Comedy‘,             Rating = ‘G‘,             Price = 7.99M         },View Code

2,執行以下命令PM>add-migration AddRatingMig

這個命令告訴migration framework 檢查當前的movie model是否和dabatase 中的Movie 欄位一致,如果不一致,就會添加必要的code來更新DB和新的Model一致:

3,解決方案下面建立了帶有時間戳記的_AddRatingMig.cs檔案,檔案中有添加和刪除新的列,保證Model和DB

中的欄位一致

namespace MVCMovie.Migrations {     using System;     using System.Data.Entity.Migrations;          public partial class AddRatingMig : DbMigration     {         public override void Up()         {             AddColumn(‘dbo.Movies‘, ‘Rating‘, c => c.String());         }                  public override void Down()         {             DropColumn(‘dbo.Movies‘, ‘Rating‘);         }     } }View Code

4,執行命令PM>update-database

5,重新整理”MovieDBContext”後我們看到在Movie.cs中添加的屬性同步到了DB的Table中:

Migrations Configuration.cs中的Sample資料也填充到了Database中:

6,Ctrl+Shift+B,Ctrl+F5運行,我們看到所有的頁面中都有了Rating:

這一節,我們可以在Model中添加新的屬性,並且同步到DB中。我們也學習了,把Sample資料填充到DB的Table中。下一節,我們將會在Model Class中對新增資料添加邏輯驗證(validation logic)和商務規則(business rules).

See You。。。

MVC學習6 學習使用Code First Migrations功能 把Model的更新同步到DB中

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.