Entity Framework 4.1 Code First (5)

Entity Framework 4.1 Code First (5) 此篇說明Complex Type 應用

此篇說明Complex Type 應用

Complex Type 的觀念蠻容易理解的,就以一般網路上的例子來說, Customer– Address

每個客戶(Customer) 都有地址資訊(Address),在Database 中可能像是下圖所示

1

 

但在程式中,我們可以設計成 Customer  與 Address 2個class 關係

2

 

預設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,下一篇再說明

 

參考網站

範例下載 CodeFirst0523.zip