ASP.NET MVC 学习6、学习使用Code First Migrations功能,把Model的更新同步到DB中
?參考:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-a-new-field-to-the-movie-model-and-table
本文內(nèi)容:
1,學(xué)習(xí)Entity Framework Code First 遷移功能(Migrations)
2,更新Model Class(Model Class中添加新的字段),然后把更新應(yīng)用于datebase.
默認(rèn)情況下,就像我們之前用Models下的movie.cs右鍵點(diǎn)擊直接添加database的時候,Code First自動在數(shù)據(jù)庫中添加新的表來記錄新添加的database時候和movie.cs同步,如果不同步,Entity Framework就會跑出錯誤。這樣我們就可以在開發(fā)的過程中發(fā)現(xiàn)錯誤,而不是必須在運(yùn)行的時候才發(fā)現(xiàn)錯誤。
?
一,為Model的改變設(shè)置Code First Migrations功能(Setting up Code First Migrations for Model Changes),從而可以讓movie.cs改變的時候,把改變應(yīng)用于Database(Model類和自動生成的數(shù)據(jù)庫同步)
1,1刪除MovieDBContext,刪除.mdf文件
1.2Ctrl+Shift+B重建解決方案后,打開“套件管理器控制臺”:
PM>提示符后面執(zhí)行Enable-Migrations命令開啟Code First Migrations功能,我們現(xiàn)在直接輸入:Enable-Migrations,可以看到提示命令:
我們需要Enable的是Movie,直接Copy提示命令中的下面的一行命令:
Enable-Migrations -ContextTypeName MvcMovie.Models.MovieDBContext
開啟成功:
解決方案下創(chuàng)建了Migrations文件夾:
1.3,更改Configuration.cs中的寫Seed方法,打開Configuration.cs,我們看到
????????{
????????????//這個方法將會在Migrations后被調(diào)用
????????????//??This?method?will?be?called?after?migrating?to?the?latest?version.
????????????//你可以用DbSet<T>的.AddOrUpdate擴(kuò)展方法,避免創(chuàng)建重復(fù)的數(shù)據(jù)
????????????//??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之后都會調(diào)用這個Seed方法,從而更新Database中的數(shù)據(jù)(Insert orUpdate)
1,4重建解決方案。為Migrations創(chuàng)建一個新的DbMigration.cs類繼承自DbMigration,這一步將會新建一個Database,這就是我們之前要刪除movie.mdf的原因.
在Package Manager Console中執(zhí)行命令:add-migration Initial ?生成 intial migration. “intial”是任意命名的,用來命名創(chuàng)建的migration文件。這個類是用來創(chuàng)建新的數(shù)據(jù)庫
Code First 創(chuàng)建了一個帶有時間戳的_Initial.cs,這個類中的代碼實(shí)現(xiàn)了創(chuàng)建數(shù)據(jù)庫表,當(dāng)你更新類中的表的時候,_Initial.cs將會運(yùn)行更新dabatbase中的表,然后Seed方法填充測試數(shù)據(jù)到Database的Table中。這些遷移文件類文件都是以時間戳為前綴命名并排序的:
????{
????????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
現(xiàn)在我們運(yùn)行命令PM>update-datebase?來創(chuàng)建數(shù)據(jù)庫,運(yùn)行Seed方法:
如果運(yùn)行update-database方法的時提示Table已經(jīng)存在,是因?yàn)槟阍趧h除表之后運(yùn)行了項(xiàng)目。如果是這樣再次把Movie.mdf刪除,然后執(zhí)行update-datebase命令。如果還是報錯,刪除Migrations文件夾,然后從上面刪除Movie.mdf處重新按照本文介紹的一步一步來。
Ctrl+F5執(zhí)行程式,我們看到了Seed方法中的數(shù)據(jù):
二,在Movie Model中添加新的屬性字段,把字段同步到DB的Table中
namespace?MVCMovie.Models{
????//Moive?類就相當(dāng)于數(shù)據(jù)庫中的一張名為Movie的Table
????//Movie?類實(shí)例化的對象相當(dāng)于Table中的一行,實(shí)例的各個屬性(ID,Title...)相當(dāng)于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數(shù)據(jù)上下文
????//MovieDBContext?class?,讀取、存儲、更新Movie?Class?實(shí)例
????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運(yùn)行程序,提示如下:
這是因?yàn)槲覀儎倓傇?/span>Model中的Movie.cs中添加了新的屬性字段,Movie.cs中的字段和已經(jīng)存在的Database中的表字段不一致:
我們用Code First Migrations來解決這個問題:
1,在Seed中的每一個對象實(shí)例中添加 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,執(zhí)行以下命令PM>add-migration AddRatingMig
這個命令告訴migration framework 檢查當(dāng)前的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,執(zhí)行命令PM>update-database
5,刷新”MovieDBContext”后我們看到在Movie.cs中添加的屬性同步到了DB的Table中:
Migrations Configuration.cs中的Sample數(shù)據(jù)也填充到了Database中:
6,Ctrl+Shift+B,Ctrl+F5運(yùn)行,我們看到所有的頁面中都有了Rating:
?
?
這一節(jié),我們可以在Model中添加新的屬性,并且同步到DB中。我們也學(xué)習(xí)了,把Sample數(shù)據(jù)填充到DB的Table中。下一節(jié),我們將會在Model Class中對新增數(shù)據(jù)添加邏輯驗(yàn)證(validation logic)和業(yè)務(wù)規(guī)則(business rules).
?
See You。。。?
?
轉(zhuǎn)載于:https://www.cnblogs.com/siri/p/3605476.html
總結(jié)
以上是生活随笔為你收集整理的ASP.NET MVC 学习6、学习使用Code First Migrations功能,把Model的更新同步到DB中的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。