共用方式為


教學課程:使用 ASP.NET MVC 應用程式增強 EF Database First 的資料驗證

您可以使用 MVC、Entity Framework 和 ASP.NET Scaffolding 來建立 Web 應用程式,藉此為現有資料庫提供介面。 本教學課程系列說明如何自動產生程式碼,讓使用者能夠顯示、編輯、建立和刪除資料庫表格中的資料。 產生的程式碼會對應至資料庫表格中的欄。

本教學課程著重於將資料註解新增至資料模型,藉此指定驗證需求與顯示格式設定。 內容已根據留言區的使用者意見反應而改善。

在本教學課程中,您已:

  • 新增資料註解
  • 新增中繼資料類別

必要條件

新增資料註解

如之前的主題中所述,某些資料驗證規則會自動套用至使用者輸入。 舉例來說,您只能為 Grade 屬性提供一個數字。 若要指定更多資料驗證規則,您可以將資料註解新增至模型類別。 這些註解在整個 Web 應用程式中都會套用到指定屬性。 您也可以套用格式設定屬性,藉此變更屬性的顯示方式,例如變更用於文字標籤的值。

在本教學課程中,您將了解如何新增資料註解,藉此限制為 FirstName、LastName 和 MiddleName 屬性所提供的值長度。 在資料庫中,這些值的長度限為 50 個字元;不過,在 Web 應用程式中,字元限制目前不受強制。 如果使用者為其中一個值提供超過 50 個字元,則在系統嘗試將值儲存至資料庫時,頁面會當機。 您也需要將 Grade 限制為 0 到 4 之間的值。

選取 [模型]>[ContosoModel.edmx]>[ContosoModel.tt],然後開啟 Student.cs 檔案。 將下列反白的程式碼新增至類別。

namespace ContosoSite.Models
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    
    public partial class Student
    {
        public Student()
        {
            this.Enrollments = new HashSet<Enrollment>();
        }
    
        public int StudentID { get; set; }
        [StringLength(50)]
        public string LastName { get; set; }
        [StringLength(50)]
        public string FirstName { get; set; }
        public Nullable<System.DateTime> EnrollmentDate { get; set; }
        [StringLength(50)]
        public string MiddleName { get; set; }
    
        public virtual ICollection<Enrollment> Enrollments { get; set; }
    }
}

開啟 Enrollment.cs,並新增下列反白的程式碼。

namespace ContosoSite.Models
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    
    public partial class Enrollment
    {
        public int EnrollmentID { get; set; }
        [Range(0, 4)]
        public Nullable<decimal> Grade { get; set; }
        public int CourseID { get; set; }
        public int StudentID { get; set; }
    
        public virtual Course Course { get; set; }
        public virtual Student Student { get; set; }
    }
}

建置方案。

按兩下 [學生名單],然後選取 [編輯]。 如果您嘗試輸入超過 50 個字元,錯誤訊息就會顯示。

顯示錯誤訊息

返回首頁。 按兩下 [註冊名單],然後選取 [編輯]。 嘗試提供大於 4 的成績。 您會收到以下錯誤:[成績] 欄位必須介於 0 到 4。

新增中繼資料類別

如果您不希望資料庫變更,直接將驗證屬性新增至模型類別即可運作;不過,如果資料庫變更,且您需要重新產生模型類別,您就會失去已套用至模型類別的所有屬性。 這種方法可能非常沒有效率,且容易遺失重要的驗證規則。

若要避免這個問題,您可以新增包含屬性的中繼資料類別。 如果您讓模型類別與中繼資料類別建立關聯時,這些屬性會套用至模型。 此方法可以重新產生模型類別,不會遺失已套用至中繼資料類別的所有屬性。

將名為 Metadata.cs 的類別新增到 Models 資料夾。

Metadata.cs 中的程式碼取代為下列程式碼。

using System;
using System.ComponentModel.DataAnnotations;

namespace ContosoSite.Models
{
    public class StudentMetadata
    {
        [StringLength(50)]
        [Display(Name="Last Name")]
        public string LastName;

        [StringLength(50)]
        [Display(Name="First Name")]
        public string FirstName;

        [StringLength(50)]
        [Display(Name="Middle Name")]
        public string MiddleName;

        [Display(Name = "Enrollment Date")]
        public Nullable<System.DateTime> EnrollmentDate;
    }

    public class EnrollmentMetadata
    {
        [Range(0, 4)]
        public Nullable<decimal> Grade;
    }
}

這些中繼資料類別包含您之前已套用至模型類別的所有驗證屬性。 Display 屬性可用來變更文字標籤所用的值。

接著,您必須讓模型類別與中繼資料類別產生關聯。

將名為 PartialClasses.cs 的類別新增到 Models 資料夾。

以下列程式碼取代檔案的內容。

using System;
using System.ComponentModel.DataAnnotations;

namespace ContosoSite.Models
{
    [MetadataType(typeof(StudentMetadata))]
    public partial class Student
    {
    }

    [MetadataType(typeof(EnrollmentMetadata))]
    public partial class Enrollment
    {
    }
}

請注意,每個類別都會標示為 partial 類別,且由於類別是自動產生,因此每個類別的名稱和命名空間都相符。 將中繼資料屬性套用至部分類別,可確保資料驗證屬性會套用至自動產生的類別。 在您重新產生模型類別時,這些屬性就不會遺失,因為中繼資料屬性會套用在未重新產生的部分類別。

若要重新產生自動產生的類別,請開啟 ContosoModel.edmx 檔案。 再次以滑鼠右鍵按一下設計介面,然後選取 [更新資料庫的模型]。 即使您尚未變更資料庫,此程序仍會重新產生類別。 在 [重新整理] 索引標籤選取 [資料表][完成]

儲存 ContosoModel.edmx 檔案即可套用變更。

開啟 Student.cs 檔案或 Enrollment.cs 檔案,並且注意,您之前套用的資料驗證屬性已不再位於檔案中。 不過,請執行應用程式,並且注意,驗證規則仍會在您輸入資料時套用。

結論

此系列提供簡單的範例,說明如何從現有的資料庫產生程式碼,讓使用者能夠編輯、更新、建立與刪除資料。 它使用 ASP.NET MVC 5、Entity Framework 和 ASP.NET Scaffolding 來建立專案。

如需開發 Code First 的入門範例,請參閱開始使用 ASP.NET MVC 5

如需更進階的範例,請參閱建立 ASP.NET MVC 4 應用程式的 Entity Framework 資料模型。 請注意,在 Database First 中用於操作資料的 DbContext API 與您在 Code First 操作資料的 API 相同。 即使您打算使用 Database First,您也可以從 Code First 教學課程瞭解如何處理更複雜的案例,例如讀取和更新相關資料、處理並行衝突等。 唯一的差異在於建立資料庫、內容類別和實體類別的方式。

其他資源

如需可套用至屬性和類別的資料驗證註解完整清單,請參閱 System.ComponentModel.DataAnnotations

下一步

在本教學課程中,您已:

  • 已新增的資料註解
  • 已新增的中繼資料類別

若要瞭解如何將 Web 應用程式和 SQL 資料庫部署至 Azure App Service,請參閱以下教學課程: