第二話-實體數據模型

實體數據模型(Entity Data Model, EDM)是一種XML格式的純文本文件,用以描述數據結構的概念,以統一的概念模型映射不同類型的數據源。分為以下

  • 實體類型:通過EDM描述數據結構基礎的建構區塊就是實體類型,其對象的形式來表示個種數據結構 如數據表Product,此種實體類型的類對象可以讓我們以對象的方式來操作數據,通過引用其Title屬性來獲取該字段的值。
    • 必須有實體鍵
    • 每一個實體類包含一組實體集(Entity Set),類似數據集DbSet
    • 集中於實體容器中(Entity Container)統一管理
  • 關聯類型: 類似於數據表關聯結構,兩個實體類型對象之間同樣存在關聯結構,而實體之間的關聯則是用關聯類型來描述。用以表示一對一、一對多、多對多
    • 通過導航屬性(Navigation Properties)存取端點的關聯實體
  • 屬性: 實體類型結構與特性通過屬性描述來實現關聯,如Product數據表中的Title屬性。

Code First 流程與觀念:

Code First通過典型的傳統類對象(Plain Old Class Object, POCO)映射到數據庫的結構。

  • 通過建立DbContext對象實例 => 建立與數據庫的連線
  • 設置的DbSet<>映射到特定的數據表結構,一個DbSet<>對象表示映射的數據表其實體數據內容的集合。
  • DbSet是一組數據集,所以需要使用ToList轉為List

實體類結構映射

泛型DbSet<TEntity>屬性構成DbContext對象內容,並反映連接的數據表結構。 <TEntity>是構成DbSet集合中的實體類,執行期間每一個對象映射到特定數據表結構並封裝特定的數據。如public DbSet<Product> Products {get; set;}實體類會自動映射到Products數據表。

其中名為Id的屬性會被自動生成主KEY,類名Id亦會,如ProductId

數據註解(Model)

一、指定數據表[Table(tbname)]

[Table(INV_ITM)]
public class Product
{

}

二、Key/Column

public class Product
{

    [Key]// 指定主鍵。
    public int cus_nbr {get;set;}

    [Required] //指定必要值(Not Null)
    [DisplayName("產品名稱")]
    [Column("ITEM_NAME")] //指定欄位
    [MaxLength(50),MinLength(2)] //指定最大長度;最小長度
    [MaxLength(50,ErrorMessage="ITEM_NAME長度不得超過50"),MinLength(2)] //錯誤顯示訊息
    public int ProductName{get;set;}

    [NotMapped] //不要映射到數據表
    public decimal Sale_Price {get; set;}

}

三、添加一筆數據時,這個字段會自動插入當前的時間

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]

public DateTime Created {get ; set; }

四、ConcurrencyCheck更新衝突 處理更新衝突使用[ConcurrencyCheck]註解 [TimeStamp]用於映射時間戳數據字段Null,而類中只能有一個TimeStamp,此類型的屬性行為與ConcurrencyCheck註解相當。


#Fluent API 一旦設置Fluent API,所有的數據註釋都會被忽略。

protected override void OnModelCreating(DbModelBuilder modeBuilder)
{
    //
    modelBuilder.Entity<Product>().ToTable("INV_ITM"); //指定表名

    modelBuilder.Ignore<Product>(); //不映射此表
    
    modelBuilder.Entity<Product>().Ingore(p => p.Sale_Price) //不將特價字段映射進資料表





}

遷移操作


STEP1 Add-Migration 第一次變更

STEP2 Update-Database

=> Update-Database-TargetMigration:第一次變更


db.SaveChanges() :提交到數據庫

數據變動與更新

Product p1 = new Product {
    Id = 24,
    Name = "Book123",
    Category="Book",
    Price = 55
}

var products = db.Products;

products.Add(p1);
db.SaveChanges();

Product p1 = new Product {
    Id = 24,
    Name = "Book123",
    Category="Book",
    Price = 55
},
Product p2 = new Product {
    Id = 24,
    Name = "Book456",
    Category="Book",
    Price = 55
}

List<Product> list = new List<Product>() {p1,p2};
db.AddRange(list);
db.SaveChanges();