Entity Framework使用DbModelBuilder API創建表結構
DbContext類有一個OnModelCreating方法,它用於流利地配置領域類到數據庫模式的映射。下面我們以fluent API的方式來定義映射。
首先,先將Product類註釋掉,重新編寫該類,重新編寫後的Product類:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace EFFluentAPI.Model { public class Product { public int ProductNo { get; set; } public string ProductName { get; set; } public double ProductPrice { get; set; } } }
然後在數據庫上下文Context類中的OnModelCreating方法中使用fluent API來定義Product表的數據庫模式:
using EFFluentAPI.Model; using System; using System.Collections.Generic; using System.Data.Entity; using System.Linq; using System.Text; using System.Threading.Tasks; namespace EFFluentAPI.EFContext { public class Context:DbContext { public Context() : base("DbConnection") { } public DbSet<Product> Products { get; set; } /// <summary> /// 重新OnModelCreating方法 /// </summary> /// <param name="modelBuilder"></param> protected override void OnModelCreating(DbModelBuilder modelBuilder) { //映射到表Product,ProductNo和ProductName作為復合主鍵 modelBuilder.Entity<Product>().ToTable("Product").HasKey(p=>new {p.ProductNo,p.ProductName}); //ProductNo映射到數據表中的列名是Id modelBuilder.Entity<Product>().Property(p => p.ProductNo).HasColumnName("Id"); modelBuilder.Entity<Product>().Property(p => p.ProductName) .IsRequired() //設置ProductName是必須的,即不能為null,默認是可以為null的 .IsUnicode() //設置ProductName列為Unicode字符,實際上默認就是Unicode字符,所以該方法可以不寫。 .HasMaxLength(10); //設置ProductName列的最大長度是10 base.OnModelCreating(modelBuilder); } } }
modelBuilder.Entity<Product>()會得到EntityTypeConfiguration類的一個實例。此外,使用fluent API的一個重要決定因素是我們是否使用瞭外部的POCO類,即實體模型類是否來自一個類庫。我們無法修改類庫中類的定義,所以不能通過數據註解來提供映射細節。這種情況下,我們必須使用fluent API。
什麼是POCO?
POCO是指Plain Old Class Object,也就是最基本的CLR Class,在原先的EF中,實體類通常是從一個基類繼承下來的,而且帶有大量的屬性描述。而POCO則是指最原始的Class,換句話說這個實體的Class僅僅需要從Object繼承即可,不需要從某一個特定的基類繼承。主要是配合Code First使用。Code First則是指我們先定義POCO這樣的實體Class,然後生成數據庫。實際上現在也可以使用Entity Framweork Power tools將已經存在的數據庫反向生成POCO的Class(不通過edmx文件)。
程序運行後創建的數據庫如下圖所示:
到此這篇關於Entity Framework使用DbModelBuilder API創建表結構的文章就介紹到這瞭。希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。
推薦閱讀:
- Entity Framework使用配置夥伴創建數據庫
- EF使用Code First模式生成單數形式表名
- Entity Framework實體拆分多個表
- Entity Framework管理一對一實體關系
- Entity Framework使用Code First的實體繼承模式