Code First Fluent API,使用流暢API來定義模型映射。
同樣使用與上文 Database First 模式相同的例子,假設需要設計一個零售系統,我們先構建一個 Customer 類。
1 public class Customer 2 { 3 public long Id { get; set; } 4 public string Name { get; set; } 5 public string Address { get; set; } 6 public string Phone { get; set; } 7 }
這次沒有使用屬性來指定對應表名稱、主鍵等。
使用代碼創建影射,
1 public class CustomerMap : EntityTypeConfiguration<Customer> 2 { 3 public CustomerMap() 4 { 5 // Primary Key 6 this.HasKey(t => t.Id); 7 8 // Properties 9 this.Property(t => t.Name) 10 .IsRequired() 11 .HasMaxLength(256); 12 13 this.Property(t => t.Phone) 14 .IsRequired() 15 .HasMaxLength(256); 16 17 // Table & Column Mappings 18 this.ToTable("Customer", "STORE"); 19 this.Property(t => t.Id).HasColumnName("Id"); 20 this.Property(t => t.Name).HasColumnName("Name"); 21 this.Property(t => t.Address).HasColumnName("Address"); 22 this.Property(t => t.Phone).HasColumnName("Phone"); 23 24 // Relationships 25 //this.HasRequired(t => t.Status) 26 // .WithMany(t => t.CustomerStatus) 27 // .HasForeignKey(d => d.Status); 28 } 29 }
在上下文對象中覆寫OnModelCreating方法來添加影射配置,
1 public class RetailEntities : DbContext 2 { 3 static RetailEntities() 4 { 5 //Database.SetInitializer<RetailEntities>(new CreateDatabaseIfNotExists<RetailEntities>()); 6 //Database.SetInitializer<RetailEntities>(new DropCreateDatabaseAlways<RetailEntities>()); 7 //Database.SetInitializer<RetailEntities>(new DropCreateDatabaseIfModelChanges<RetailEntities>()); 8 Database.SetInitializer<RetailEntities>(null); 9 } 10 11 public RetailEntities() 12 : base("Name=RetailEntities") 13 { 14 } 15 16 public DbSet<Customer> Customers { get; set; } 17 18 protected override void OnModelCreating(DbModelBuilder modelBuilder) 19 { 20 modelBuilder.Configurations.Add(new CustomerMap()); 21 } 22 }
ICustomerRepository接口和實現依然類似,
1 public void InsertCustomer(DomainModels.Customer customer) 2 { 3 using (RETAILContext context = new RETAILContext()) 4 { 5 Customer entity = Mapper.Map<DomainModels.Customer, Customer>(customer); 6 context.Customers.Add(entity); 7 context.SaveChanges(); 8 9 customer.Id = entity.Id; 10 } 11 } 12 13 public void UpdateCustomer(DomainModels.Customer customer) 14 { 15 using (RETAILContext context = new RETAILContext()) 16 { 17 Customer entity = context.Customers.AsQueryable().Single(c => c.Id == customer.Id); 18 19 entity.Name = customer.Name; 20 entity.Address = customer.Address; 21 entity.Phone = customer.Phone; 22 23 context.SaveChanges(); 24 } 25 }
同樣的測試代碼,
1 ICustomerRepository customerRepository = new CustomerRepository(); 2 3 // =============== 增 =============== 4 Console.ForegroundColor = ConsoleColor.DarkRed; 5 6 DomainModels.Customer customer1 = new DomainModels.Customer() 7 { 8 Name = "Dennis Gao", 9 Address = "Beijing", 10 Phone = "18888888888", 11 }; 12 customerRepository.InsertCustomer(customer1); 13 Console.WriteLine(customer1);
當然,你可能覺得手工寫影射代碼還是比較繁瑣,如果已有部分數據表結構,希望反向生成代碼,可使用工具 Entity Framework Power Tools 來生成。
Entity Framework Power Tools 拯救程序員啊。
完整代碼和索引
EntityFramework用法探索系列