Create a complex data model - ASP.NET MVC with EF Core

Customize the Data Model

可以使用 Attributes 來建立自己想要的 Model
  • DataType
DataType 跟 SQL 的 Data Type 類似, 但是會比 SQL 的 Data Type 有更多種選擇, 在 EF 裡面, 如果有 email 的 input 可以指定 data type 是DataType.EmailAddress, 如果只想要日期不要時間, 可以使用 DataType.Date
  • DisplayFormat
想要在 View 上呈現的 format 是甚麼, 例如
  • StringLength
指定 string 最長的長度, database 跟 MVC project 都會被套用
  • RegularExpression
如果想要消除空白, 那麼可以使用 Regular Expression
  • MaxLength
沒有 Client side 的 validation, 指定最大的長度
  • Column
1.當 table 的名字跟 model class 不一樣時, 可以使用 Column, [Column(“”)] 裡面裝的會是 table 的名字
2.可以使用 Column 指定 SqlServer 的 data type
[Column(TypeName="money")]
public decimal Budget { get; set; }
  • Required
Required 必須要和 MinimumLength 一起做搭配才會有作用
  • Display
顯示在 View 的名字

當做完 update 的時候, 要打 migrations add <migration-name> 然後 dotnet ef database update

一對多的關係

在官方文章上面, 一個 Instructor 可以教很多課, 所以 在 Instructor 的 table 裡面CourseAssignments 可以是被定義成一個 collection

一對一的關係

一個 Instructor 最多只能有 1 個 office,
  • Key
別的 table 的 primary key, 不是 db 裡面的 primary key, 目的只有辨別 column 的關係
  • Foreign Key
在 EF 裡面, 並不一定要有 FK, 只要 FK 沒有出現 EF 就會幫他們產生一個叫做 shadow properties 的東西, 但是有 FK 在 fetch data 的效率會比較好
  • DatabaseGenerated
    可以產生 default value
  • Foreign key and Navigation Property
如果是 1 對 1, 只要有 foreign key column 和原本 typed 的 navigation property
如果是 1 對多, 要有 ICollection
  • 可有可無
可以在 data type 的後面加上 ?
public int? InstructorID { get; set; }
public Instructor Administrator { get; set; }
  • Many to Many join table with payload
payload 的意思是除了foreign key 以外, 這一個 table 還有其他的 property
  • Join table without table (join table)
    這一個跟之前所 create table 的規則是一樣的
  • Join Entity Name
    一般來說, 可以使用 table1 和 table2 的 name 加起來變成是 Join Entity Name, 但是通常這一種 join table 到後面就會有 payload 所產生, 所以最好給一個特定的名字
舉例 :
Books 跟 Customers 的 Join Entity Name 可以是 Rating, 因為一本書可以有很多個 rating, 一個 customer 可以寫很多個 rating
Instructor 跟 Course 的 Join Entity Name 可以是 CourseAssignment, 因為一個 Instructor 可以有很多個 assignment, 一個 course可以寫很多個 assignment
  • Composite Key
通常都會在 join table 裡面, 因為 join table 會有 2 邊 table 的 foreign key, 所以每一個 row 都沒版法有 unique 的數字, 所以使用 Composite Key 就是把 2 邊的 foreign key 看成是一個很大的 key, 這樣就可以有 unique identifier 的功能, 前提是每一個 row 的 data 都要不一樣
在 EF 中想要使用 Composite Key 不能用 Attribute, 而是使用 fluent API, 畫紅線的地方是使用 Composite Key

留言

這個網誌中的熱門文章

ASP.NET Web API - DTOs

Scaffold Identity into the Current Project

Passing data from controller to the view