日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

ASP.NET MVC 学习6、学习使用Code First Migrations功能,把Model的更新同步到DB中

發布時間:2025/4/16 asp.net 57 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

本文內容:

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

2,更新Model ClassModel 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改變的時候,把改變應用于DatabaseModel類和自動生成的數據庫同步)

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方法填充測試數據到DatabaseTable中。這些遷移文件類文件都是以時間戳為前綴命名并排序的:

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中添加新的屬性字段,把字段同步到DBTable

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文件,文件中有添加和刪除新的列,保證ModelDB

中的字段一致

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中添加的屬性同步到了DBTable中:

Migrations Configuration.cs中的Sample數據也填充到了Database中:


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

?

?

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

?

See You。。。?


?

轉載于:https://www.cnblogs.com/siri/p/3605476.html

總結

以上是生活随笔為你收集整理的ASP.NET MVC 学习6、学习使用Code First Migrations功能,把Model的更新同步到DB中的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。