Entity Framework 4.1 Code First (5) 此篇說明Complex Type 應用
此篇說明Complex Type 應用
Complex Type 的觀念蠻容易理解的,就以一般網路上的例子來說, Customer– Address
每個客戶(Customer) 都有地址資訊(Address),在Database 中可能像是下圖所示
但在程式中,我們可以設計成 Customer 與 Address 2個class 關係
預設Code First 會自動判斷出Complex Type,但我個人建議還是嚴謹一點,加入ComplexTypeAttribute
[ComplexType]
public class Address {
[Column("Road")]
public String Road { get; set; }
[Column("ZipCode")]
public String ZipCode { get; set; }
[Column("State")]
public String State { get; set; }
}
或是使用Fluent API
protected override void OnModelCreating(DbModelBuilder modelBuilder) {
modelBuilder.ComplexType<Address>();
}
Customer class
public class Customer {
public int CustomerId { get; set; }
public String Name { get; set; }
public DateTime CreationDate { get; set; }
public Address Address { get; set; }
}
若是另外的class 也有Address property 也可一樣作法,例如員工(Employee)也有Address property
public class Employee {
public int EmployeeId { get; set; }
public String Name { get; set; }
public String Title { get; set; }
public Address Address { get; set; }
}
而且還可以針對不同的entity 對應不同的address field,例如
protected override void OnModelCreating(DbModelBuilder modelBuilder) {
modelBuilder.Entity<Customer>().Property(c => c.Address.Road).HasColumnName("CustomerRoad");
modelBuilder.Entity<Employee>().Property(e => e.Address.Road).HasColumnName("EmployeeRoad");
}
不過使用Complex Type 需注意幾件事,以上述範例來說
1. 若Customer 異動時,Address若為null,會發生 exception,下面這段code 未initial Address,實際執行時會出錯
using (var context = new MyDbContext("Name=MyDb")) {
var cust = new Customer { Name = "Name", CreationDate = DateTime.Now };
context.Customers.Add(cust);
context.SaveChanges();
}
加入initial Address code 即可,既使Address 的property 都是null
using (var context = new MyDbContext("Name=MyDb")) {
var cust = new Customer { Name = "Name", CreationDate = DateTime.Now, Address = new Address() };
context.Customers.Add(cust);
context.SaveChanges();
}
2. Complex Type 是沒有key 值的,就像是value type
3. Comlex Type 不能Lazy Loading,它是屬於Entity 一部份,若有需要lazy loading,譬如為避免load 大量資料(圖檔),可以使用table spliting,下一篇再說明
參考網站
- Associations in EF 4.1 Code First: Part 2 – Complex Types
- ADO.NET team blog
- Don't Be Iffy - Julie Lerman's Blog
範例下載 CodeFirst0523.zip