<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # ASP.NET MVC 5 - 給電影表和模型添加新字段 在本節中,您將使用Entity Framework Code First來實現模型類上的操作。從而使得這些操作和變更,可以應用到數據庫中。 默認情況下,就像您在之前的教程中所作的那樣,使用 Entity Framework Code First自動創建一個數據庫,Code First為數據庫所添加的表,將幫助您跟蹤數據庫是否和從它生成的模型類是同步的。如果他們不是同步的,Entity Framework將拋出一個錯誤。這非常方便的在開發時就可以發現錯誤,否則您可能會在運行時才發現這個問題。 ## 為對象模型的變更設置 Code First Migrations 從解決方案資源管理器中雙擊_Movies.mdf_,打開數據庫工具, 在數據庫工具 (數據庫資源管理器、 服務器資源管理器或 SQL Server對象資源管理器),右鍵單擊_Movies.mdf_ f,并選擇**刪除**。 ![](https://box.kancloud.cn/2016-01-02_568736b80464c.jpg) Build應用程序,以確保沒有任何編譯錯誤。 從**工具**菜單上,單擊**庫包管理器**,然后點擊**程序包管理器控制臺**. ![](https://box.kancloud.cn/2016-01-02_568736b817c4e.jpg) 在**程序包管理器控制臺窗口,在提示符** PM&gt; 后輸入: Enable-Migrations -ContextTypeName MvcMovie.Models.MovieDBContext ![](https://box.kancloud.cn/2016-01-02_568736b82a2e5.gif) 如上所示的**Enable-Migrations** 命令,會在_Migrations_文件夾下創建一個_Configuration.cs_ 文件。 ![](https://box.kancloud.cn/2016-01-02_568736b8419ac.jpg) 在Visual Studio 里面打開_Configuration.cs_ 文件. 用下面的代碼替換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 } ); } ``` 右鍵單擊紅色波浪線下Movie,并選擇“解析(**Resolve**)”,然后單擊“**using** **MvcMovie.Models**; ![](https://box.kancloud.cn/2016-01-02_568736b8565fe.jpg) 這樣做會增加下面的語句: using MvcMovie.Models; Code First Migrations調用Seed的方法,每個遷移(**程序包管理器控制臺**更新數據庫),此方法用于updates數據(如果數據存在),或inserted數據。 在[AddOrUpdate](http://msdn.microsoft.com/en-us/library/system.data.entity.migrations.idbsetextensions.addorupdate(v=vs.103).aspx)方法在下面的代碼執行一個的“upsert”操作: ``` context.Movies.AddOrUpdate(i => i.Title, new Movie { Title = "When Harry Met Sally", ReleaseDate = DateTime.Parse("1989-1-11"), Genre = "Romantic Comedy", Rating = "PG", Price = 7.99M } ``` 因為[Seed](http://msdn.microsoft.com/en-us/library/hh829453(v=vs.103).aspx)方法與每個遷移同時運行時,故,你不能僅僅插入數據,因為當你正試圖添加,可能已經完成了創建數據庫后的第一次遷移。“[upsert](http://en.wikipedia.org/wiki/Upsert)”操作阻止錯誤的發生,如果你嘗試插入一個已經存在的行,它覆蓋任何數據更改,當你在測試應用程序的同時。你可能不希望這樣的事情發生:在某些情況下,當您更改數據測試時,你希望你的變化后數據庫同步更新。在這種情況下,你想要做一個有條件的插入操作:只有當它不存在的時候,插入一行。 傳遞給[AddOrUpdate](http://msdn.microsoft.com/en-us/library/system.data.entity.migrations.idbsetextensions.addorupdate(v=vs.103).aspx)的方法的第一個參數, 指定的屬性來使用以檢查是否已存在某行。對于您所提供的測試影片的數據,Title屬性可以被用于此目的,因為每個標題在列表中是唯一: context.Movies.AddOrUpdate(i =&gt; i.Title, 這個代碼假設titiles屬性是唯一的。如果手動添加一個重復的標題,你會得到下面的異常。 更多關于 [AddOrUpdate](http://msdn.microsoft.com/en-us/library/system.data.entity.migrations.idbsetextensions.addorupdate(v=vs.103).aspx) 方法的信息,請參見 [Take care with EF 4.3 AddOrUpdate Method](http://thedatafarm.com/blog/data-access/take-care-with-ef-4-3-addorupdate-method/).. **按** **CTRL-SHIFT-B** **來****Build****工程。**(如果此次Build不成功,以下的步驟將會失敗。) 下一步是創建一個DbMigration類,用于初始化數據庫遷移。此遷移類將創建新的數據庫,這也就是為什么在之前的步驟中你要刪除`movie.mdf`文件。 在**軟件包管理器控制臺**窗口中,輸入"add-migration Initial"命令來創建初始遷移。" Initial" 的名稱是任意,是用于創建遷移文件的名稱。 ![](https://box.kancloud.cn/2016-01-02_568736b86a74d.jpg) Code First Migrations將會在Migrations文件夾中創建另一個類文件 (文件名為: _{DateStamp}_Initial.cs_ ),此類中包含的代碼將創建數據庫的Schema。遷移文件名使用時間戳作為前綴,以幫助用來排序和查找。查看_{DateStamp}_Initial.cs_文件,它包含了為電影數據庫創建電影表的說明。當您更新數據庫時, _{DateStamp}_Initial.cs_文件將會被運行并創建 DB 的Schema。然后**Seed**方法將運行,用來填充 DB 的測試數據。 在**軟件包管理器控制臺**中,輸入命令" update-database ",創建數據庫并運行**Seed**方法。 ![](https://box.kancloud.cn/2016-01-02_568736b8829d9.jpg) 如果您收到表已經存在并且無法創建的錯誤,可能是因為您已經刪除了數據庫,并且在執行update-database之前,您運行了應用程序。在這種情況下,再次刪除Movies.mdf文件,然后重試update-database命令。如果您仍遇到錯誤,刪除Migration文件夾及其內容,然后從頭開始重做。(即刪除Movies.mdf文件,然后再進行Enable-Migrations) 運行該應用程序,然后瀏覽URL /Movies Seed數據顯示如下: ![](https://box.kancloud.cn/2016-01-02_568736b896335.gif) ## 為影片模型添加評級(Rating)屬性 給現有的Movie類,添加新的Rating屬性。打開Models\Movie.cs文件并添加如下Rating屬性: public string Rating { get; set; } 完整的`Movie`類如下: ``` public class Movie { public int ID { get; set; } public string Title { get; set; } [Display(Name = "Release Date")] [DataType(DataType.Date)] [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)] public DateTime ReleaseDate { get; set; } public string Genre { get; set; } public decimal Price { get; set; } public string Rating { get; set; } } ``` Build 應用程序 **Build**&gt;**Build Move**或CTRL-SHIFT-B. 因為你已經添加了新的字段,電影類的,你還需要Bind,所以這次新的屬性將被包含。更新的綁定屬性,Create和Edit動作方法, 包括Rating屬性: [Bind(Include = "ID,Title,ReleaseDate,Genre,Price,Rating")] 您還需要更新視圖模板,以顯示瀏覽器視圖中創建和編輯新的評級(Rating)屬性。 打開_\Views\Movies\Index.cshtml_文件,在**Price**列后面添加`&lt;th&gt;Rating&lt;/th&gt;`的列頭。然后添加一個`&lt;td&gt;`列來顯示`@item.Rating`的值。下面是更新的_Index.cshtml_視圖模板: ``` @model IEnumerable<MvcMovie.Models.Movie> @{ ViewBag.Title = "Index"; } <h2>Index</h2> <p> @Html.ActionLink("Create New", "Create") @using (Html.BeginForm("Index", "Movies", FormMethod.Get)) { <p> Genre: @Html.DropDownList("movieGenre", "All") Title: @Html.TextBox("SearchString") <input type="submit" value="Filter" /> </p> } </p> <table class="table"> <tr> <th> @Html.DisplayNameFor(model => model.Title) </th> <th> @Html.DisplayNameFor(model => model.ReleaseDate) </th> <th> @Html.DisplayNameFor(model => model.Genre) </th> <th> @Html.DisplayNameFor(model => model.Price) </th> <th> @Html.DisplayNameFor(model => model.Rating) </th> <th></th> </tr> @foreach (var item in Model) { <tr> <td> @Html.DisplayFor(modelItem => item.Title) </td> <td> @Html.DisplayFor(modelItem => item.ReleaseDate) </td> <td> @Html.DisplayFor(modelItem => item.Genre) </td> <td> @Html.DisplayFor(modelItem => item.Price) </td> <td> @Html.DisplayFor(modelItem => item.Rating) </td> <td> @Html.ActionLink("Edit", "Edit", new { id=item.ID }) | @Html.ActionLink("Details", "Details", new { id=item.ID }) | @Html.ActionLink("Delete", "Delete", new { id=item.ID }) </td> </tr> } </table> ``` 下一步,打開_\Views\Movies\Create.cshtml_文件,并在form標簽結束處的附近添加如下代碼。您可以在創建新的電影時指定一個電影等級。 ``` <div class="form-group"> @Html.LabelFor(model => model.Price, new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.Price) @Html.ValidationMessageFor(model => model.Price) </div> </div> <div class="form-group"> @Html.LabelFor(model => model.Rating, new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.Rating) @Html.ValidationMessageFor(model => model.Rating) </div> </div> <div class="form-group"> <div class="col-md-offset-2 col-md-10"> <input type="submit" value="Create" class="btn btn-default" /> </div> </div> </div> } <div> @Html.ActionLink("Back to List", "Index") </div> @section Scripts { @Scripts.Render("~/bundles/jqueryval") } <div class="form-group"> @Html.LabelFor(model => model.Price, new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.Price) @Html.ValidationMessageFor(model => model.Price) </div> </div> <div class="form-group"> @Html.LabelFor(model => model.Rating, new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.Rating) @Html.ValidationMessageFor(model => model.Rating) </div> </div> <div class="form-group"> <div class="col-md-offset-2 col-md-10"> <input type="submit" value="Create" class="btn btn-default" /> </div> </div> </div> } <div> @Html.ActionLink("Back to List", "Index") </div> @section Scripts { @Scripts.Render("~/bundles/jqueryval") } ``` 現在,您已經更新應用程序代碼以支持了新的`Rating`屬性。 現在運行該應用程序,然后瀏覽 _/Movies_的 URL。然而,當您這樣做時,您將看到以下之一的錯誤信息: ![](https://box.kancloud.cn/2016-01-02_568736b8a5a17.gif) 自從數據庫創建后,備份的'MovieDBContext上下文模型已經改變。請考慮使用Code First Migrations更新數據庫 (http://go.microsoft.com/fwlink/?LinkId=238269). ![](https://box.kancloud.cn/2016-01-02_568736b8bb8f8.gif) 你看到這個錯誤,因為更新的的Movie模型類中比現在Movie現有數據庫表的schema不同。 (在數據庫表中沒有Rating列。) 有幾個解決錯誤的方法: 1\. Entity Framework會自動刪除并重新創建數據庫根據新模型類schema。在開發周期的早期, 這種方式非常方便,當你正在做開發一個測試數據庫,它可以讓你快速演進模型和數據庫schema。不足之處,你將失去現有的數據庫中的數據 - 所以對生產數據庫你不想使用這種方法! 通常是一個富有成效的辦法,開發一個應用程序來初始化數據庫的自動測試數據。更多關于Entity Framework database初始化的信息,請參閱Tom Dykstra's fantastic [ASP.NET MVC/Entity Framework tutorial](http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/creating-an-entity-framework-data-model-for-an-asp-net-mvc-application). 2\. 顯式修改現有數據庫的架構,以便它匹配的模型類。這種方法的優點是,你保持你的數據。可以使手動或通過建立數據庫更改腳本實現它。 3\. 使用Code First Migrations來更新數據庫schema。 在本教程中,我們將使用Code First Migrations方法。 更新Seed 方法,以使它可以給新列提供一個值。 打開Migrations\Configuration.cs 文件,在每個Movie下添加Rating 字段. ``` new Movie { Title = "When Harry Met Sally", ReleaseDate = DateTime.Parse("1989-1-11"), Genre = "Romantic Comedy", Rating = "PG", Price = 7.99M }, ``` 編譯解決方案,打開**程序包管理器控制臺****窗體,輸入如下命令:** add-migration Rating `add-migration`命令告訴migration framework,來檢查當前電影模型與當前的影片 DB Schema并創建必要的代碼以將數據庫遷移到新的模型。AddRatingMig 是一個任意的文件名參數,用于命名migration文件。它將有助于使得遷移步驟成為一個有意義的名字。 當命令完成后,用Visual Studio 打開類文件,新繼承自`DbMIgration` 類的定義,并在`Up` 方法中,您可以看到創建新列的代碼: ``` public partial class AddRatingMig : DbMigration { public override void Up() { AddColumn("dbo.Movies", "Rating", c => c.String()); } public override void Down() { DropColumn("dbo.Movies", "Rating"); } } ``` Build解決方案,然后在 **程序包管理器控制臺**窗口中輸入"update-database"命令。 下面的圖片顯示了 **程序包管理器控制臺**窗口的輸出 (日期戳前面添加的評級會有所不同) ![](https://box.kancloud.cn/2016-01-02_568736b8d30dd.jpg) 重新運行應用程序,然后瀏覽 /Movies 的 URL。您可以看到新的評級字段。 ![](https://box.kancloud.cn/2016-01-02_568736b8e78cf.jpg) 單擊**CreateNew**鏈接來添加一部新電影。注意,請您可以為電影添加評級。 ![](https://box.kancloud.cn/2016-01-02_568736b9075de.jpg) 單擊**Create**。新的電影,包括評級,將顯示在電影列表中: ![](https://box.kancloud.cn/2016-01-02_568736b918ce6.jpg) 該項目目前正在使用的遷移 (migrations),當你添加新的字段或更新數據庫Schema, 你不需要刪除數據庫。在下一節中,我們將讓更多的架構更改,并使用遷移來更新的數據庫。 此外您也應該把`Rating` 字段添加到Edit、Details和Delete的視圖模板中。 您可以再次在 **程序包管理器控制臺**窗口中輸入"update-database"命令,將不會有任何新的變化,因為數據庫Schema 和模型類現在是匹配的。然而,運行“update-database”將運行再次Seed方法,如果你改變任何種子數據,更改都將丟失,因為Seed的方法upserts數據。你可以閱讀更多關于Seed的方法Tom Dykstra's的流行的[ASP.NET MVC/Entity Framework tutorial](http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/creating-an-entity-framework-data-model-for-an-asp-net-mvc-application).。 在本節中,您看到了如何修改模型對象并始終保持其和數據庫Schema的同步。您還學習了使用填充示例數據來創建新數據庫的例子,您可以反復嘗試。這只是一個簡單的介紹Code First,更完整的教程的請參閱[Creating an Entity Framework Data Model for an ASP.NET MVC Application](http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/creating-an-entity-framework-data-model-for-an-asp-net-mvc-application)。接下來,讓我們看看如何將豐富的驗證邏輯添加到模型類,并對模型類執行一些強制的業務規則驗證。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看