說明:MvcMovieStore項目已經發布上線,想了解最新版本功能請登錄 MVC影視(MvcMovie.cn) 進行查閱。如需轉載,請注明出處:http://www.cnblogs.com/DoduNet/
上一章我們討論了如何創建項目和添加/更新程序包,這一章我們討論一下如何創建數據上下文和數據實體模型;當然,MVC的運行模式大家應該都很清楚,MVC 表示 模型-視圖-控制器。MVC 是一種用於應用程序開發的框架,基於 MVC 應用程序中包含:
- Models: 表示應用程序的數據和使用驗證邏輯來強制執行業務規則的數據的類。
- Views: 您的應用程序用來動態生成 HTML 響應的模板文件。
- Controllers: 處理傳入的瀏覽器請求的類中檢索模型數據,然后指定將響應返回到瀏覽器中的視圖模板。
至於如何添加 控制器、模型、視圖這些概念在【譯】ASP.NET MVC 5 官方教程這個系列教程中都有詳細提到,所以我們並不作為主要講解內容,在以后的過程中也都會涉及到。
現在我們再來看一下Code First,Code First最原始的原型實際上被叫做只有代碼(Code Only)。這是因為開發者只需要寫代碼,將會自動創建模型和數據庫。是因為有一個特別的類(繼承與System.Data.Entity.DbContext),這個類就是我們即將要談到的數據上下文,而數據上下文又與我們在Web.config中設置的數據連接字符串相對應,數據連接配置 和 數據上下文的關系,這里不作過多闡述。
創建數據上下文:
打開我們上節中已經創建好的項目,可以在解決方案資源管理器中看到如下圖所示的IdentityModels.vb這個文件,如下圖所示:
從文件名我們大概可以理解為:身份模型,顧名思義就是說這個文件中應該是與我們這個項目所使用的身份認證有關的類或者設置。打開之后我們可以看到兩個類:
1 Imports Microsoft.AspNet.Identity.EntityFramework 2 3 ' You can add profile data for the user by adding more properties to your ApplicationUser class, please visit http://go.microsoft.com/fwlink/?LinkID=317594 to learn more. 4 Public Class ApplicationUser 5 Inherits IdentityUser 6 End Class 7 8 Public Class ApplicationDbContext 9 Inherits IdentityDbContext(Of ApplicationUser) 10 Public Sub New() 11 MyBase.New("DefaultConnection") 12 End Sub 13 End Class
ApplicationUser:應用程序用戶,ApplicationDbContext:應用程序數據上下文;
不錯,項目默認已經為我們創建好了數據上下文,你可能會問現在這個類怎么不是繼承的System.Data.Entity.Dbcontext呀?,那么,我們在IdentityDbContext處點擊右鍵,選擇轉到定義,如下圖所示:
之后會在工作區打開“對象瀏覽器”窗口,從這里可以很清楚的看出,IdentityDbContext的繼承關系,沒看錯,他就是繼承的System.Data.Entity.Dbcontext;如下圖所示:
也就是說,我們的項目中已經有了一個數據上下文存在,那么我還需要再創建一個嗎?,對於我們現有的項目,不需要多個數據庫,一個就夠我們用的了,所以答案是,不需要!需要的是我們對此進行擴充。我們現在來運行一下項目,看看這個數據上下文是不是真的有效。按F5運行項目,等待打開瀏覽器……,如下圖所示:
我們在項目的web.config中默認提供了數據連接字符串,根據字符串我們知道數據庫的位置應該是在項目根目錄的app_Data文件夾,點擊導航欄中的“注冊”,並完成表單注冊一個用戶(想驗證剛才提到的數據上下文是否有效,需要頁面操作涉及到數據模型的操作時,mvc才會通過數據上下文自動創建數據庫),如下圖所示:
如注冊成功后,會自動登陸,並轉到首頁,當看到導航欄右側有歡迎詞語時,說明我們已經注冊成功!如下圖所示:
那么打開App_Data文件夾,你就會發現多出來了兩個文件:
- aspnet-MvcMovieStore.Web-20131104112149.mdf
- aspnet-MvcMovieStore.Web-20131104112149_log.ldf
bingo,你猜對了,這個數據上下文是正常工作的,只不過ApplicationDbContext 繼承與IdentityDbContext(Of ApplicationUser)這個類就是添加了身份認證功能,關於Aspnet.Identity 身份認證功能我們在后面的章節中會詳細闡述。而現在我們完全可以使用這個數據上下文來完成我們之后的操作,僅僅需要的是我們對該數據上下文進行擴充,至於擴充的屬性,我們等創建數據實體模型后再講。
創建數據實體模型:
在 原創:MVC 5 實例教程(MvcMovieSore 新概念版:mvc5.0,EF6.01) - 2、數據框架 和 功能預覽 中我有貼出“數據結構拓撲圖”,這些數據表(也就是上面提到的MVC中的“Models”)是如何創建,以及各個表中間的關系是我們這章的主要內容。
下面我們再來看一下數據結構拓撲圖:
圖中的每一個數據表都是一個數據實體,都是一個類,而每一個類都以特別的身份出現在上面我們講到的數據上下文中。下面我們僅僅以“Movie”及與其相關聯的幾個實體為例來說明創建數據實體模型:
在解決方案資源管理器中找到 Models文件夾,點擊右鍵依次選擇:添加/類,如下圖所示:
在新建類對話框的類名處輸入:MvcMovieStoreModels.vb,之后會看到剛剛建好的類,如下圖所示:
刪除現有的代碼,然后粘貼以下代碼:
1 Public Class Movie 2 3 Property MovieID As Guid 4 Property ChannelID As Guid 5 Property Categories As String 6 Property Poster As String 7 Property Still As String 8 Property Title As String 9 Property TranslationTitle As String 10 Property ReleaseYear As String 11 Property Area As String 12 Property HDType As String 13 Property Language As String 14 Property Subtitle As String 15 Property Format As String 16 Property FileSize As String 17 Property Duration As String 18 Property Director As String 19 Property Actors As String 20 Property Summary As String 21 Property Hits As Int32 22 Property PlayCount As Int32 23 Property CreationDate As Date 24 Property Creator As String 25 Property IsRecommendation As Boolean 26 Property RecommendationDate As String 27 Property Score As Decimal 28 29 End Class
這里面的每一個屬性最終都會被解釋成為數據表的一個字段,每個字段的意思不需要我再來解釋了吧(如果真不明白的話就用谷歌翻譯,或者必應翻譯)。
向Movie模型中添加驗證規則
現在開始向Movie類添加一些驗證邏輯,利用內置的Required、 StringLength、RegularExpression和Range的驗證特性,來更新剛才建好的Movie類,結果如下代碼:
Imports System.ComponentModel Imports System.ComponentModel.DataAnnotations Imports System.ComponentModel.DataAnnotations.Schema Imports System.Globalization Imports System.Data.Entity Imports System.Security.Claims Imports Microsoft.AspNet.Identity.EntityFramework Imports Microsoft.AspNet.Identity Imports System.Threading Imports Microsoft.AspNet.Identity.Owin
Public Class Movie <Key, DatabaseGenerated(DatabaseGeneratedOption.Identity), ScaffoldColumn(False)> Property MovieID As Guid <Required, Display(Name:="頻道")> Property ChannelID As Guid <Required, Display(Name:="頻道分類")> Property Categories As String <Required, StringLength(100), Display(Name:="海報")> Property Poster As String <Required, StringLength(100), Display(Name:="劇照")> Property Still As String <Required, StringLength(50), Display(Name:="片名")> Property Title As String <StringLength(50), Display(Name:="譯名")> Property TranslationTitle As String <Required, StringLength(5), Display(Name:="年代")> Property ReleaseYear As String <Required, StringLength(20), Display(Name:="區域")> Property Area As String <Required, StringLength(20), Display(Name:="畫質")> Property HDType As String <Required, StringLength(20), Display(Name:="語言")> Property Language As String <Required, StringLength(20), Display(Name:="字幕")> Property Subtitle As String <StringLength(20), Display(Name:="格式")> Property Format As String <StringLength(20), Display(Name:="大小")> Property FileSize As String <StringLength(20), Display(Name:="時長")> Property Duration As String <StringLength(100), Display(Name:="導演")> Property Director As String <Display(Name:="演員")> Property Actors As String <Display(Name:="簡介"), Required, AllowHtml> Property Summary As String <Required, Display(Name:="熱度")> Property Hits As Int32 <Required, Display(Name:="播放次數")> Property PlayCount As Int32 <Required, Display(Name:="創建日期")> Property CreationDate As Date <Required, StringLength(20), Display(Name:="創建者")> Property Creator As String <Required, Display(Name:="推薦")> Property IsRecommendation As Boolean <StringLength(20), Display(Name:="推薦日期"), ScaffoldColumn(False)> Property RecommendationDate As String <Required(ErrorMessage:="必填"), Display(Name:="評分"), Range(1, 10, ErrorMessage:="介於1~10之間")> <RegularExpression("^[-+]?[0-9]*\.?[0-9]+$", ErrorMessage:="格式無效")> Property Score As Decimal End Class
驗證屬性是指要執行它們應用到模型屬性上面的行為。 這里我們僅列出比較常用的幾種Model驗證屬性:
- Required和MinimumLength 屬性指示屬性必須有一個值 ;
- Range屬性限制必須為指定范圍內的值。
- StringLength屬性允許您設置一個字符串屬性的最大長度和其最小長度(可選)。
- 值類型的屬性 (例如decimal, int, float, DateTime)本身就有默認值,所以不需要在專門使用Required 驗證屬性。
Movie類已經建好了,其他數據實體類我是都寫在MvcMovieStoreModels.vb這個文件中了,當然你也可以分開來寫(一個文件中只有一個類)。下面是MvcMovieStore項目用到的所有數據實體模型類的源碼,可以 點擊下載。
之后呢,就是上面遺留下來的問題,我們需要讓這些實體類與我們的數據上下文進行關聯,就是在ApplicationDbContext類中添加以下屬性代碼:
1 Property Movies As DbSet(Of Movie) 2 3 Property Channels As DbSet(Of Channel) 4 Property Categories As DbSet(Of Category) 5 Property ChannelCategoryMaps As DbSet(Of ChannelCategoryMap) 6 Property MovieCategoryMaps As DbSet(Of MovieCategoryMap) 7 Property Areas As DbSet(Of Area) 8 Property ReleaseYears As DbSet(Of ReleaseYear) 9 Property HDTypes As DbSet(Of HDType) 10 Property Actors As DbSet(Of Actor) 11 Property Actormaps As DbSet(Of Actormap) 12 Property Posters As DbSet(Of Poster) 13 Property Scores As DbSet(Of Score) 14 Property DownloadUrls As DbSet(Of DownloadUrl) 15 Property Comments As DbSet(Of Comment) 16 17 Property Carousels As DbSet(Of Carousel)
至此,數據上下文和數據實體模型就建好了,后面將介紹如何使用這些數據實體類,進行CRUD操作。敬請等待后續…
說明:MvcMovieStore項目已經發布上線,想了解最新版本功能請登錄 MVC影視(MvcMovie.cn) 進行查閱。如需轉載,請注明出處:http://www.cnblogs.com/DoduNet/,或加入 MvcMovieStore 群進行討論: