第二話-實體數據模型
第二話-實體數據模型
實體數據模型(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();