標籤:style blog http color ar os sp div on
基本上sql中要表示繼承關係有3中方式.
分別是,1表繼承(TPH),2表繼承(TPC),3表繼承(TPT)
1表 :
Person
id type name classroom office
1 student keat 1B null
2 teacher xinyao null Lv2-T2
好處是不用 inner join 快,壞處是null 很多,浪費空間, column很長不好看。
2表:
這個很瞎不要學 .. , 大概就是沒有父表,字表很多,但是每個column都重複寫...無言
3表: (3隻是代號,其實是看子類多少就多少表,子表的 id 是跟父表一樣的)
Person
id name
Student
id classroom
Teacher
id office
這樣就沒有null了,只是要inner join 會慢
entity 是用 Fluent API 來實現的
3表方式
[Table("person")] public class Person { [Key] public Int32 id { get; set; } public string name { get; set; } } //子類不要寫 [table("")]public class Student : Person { public string classroom { get; set; } }public class Teacher : Person { public string office { get; set; } }
Fluent API
protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<Person>(). //對Person Map<Student>(s => s.ToTable("student")). //map 另外2個table , "student" 是tableName Map<Teacher>(t => t.ToTable("teacher")); base.OnModelCreating(modelBuilder); }
insert 的話直接執行個體化字類就可以了
db.students.Add(new Student { name = "keatkeat", classroom = "1B" }); db.SaveChanges();View Code
1表方式 :
[Table("person")] public class Person { [Key] public Int32 id { get; set; } public string name { get; set; } } /* 子類千萬不要寫 [Table()] 了 */ public class Student : Person { public string classroom { get; set; } } public class Teacher : Person { public string office { get; set; } }
Fluent API
protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<Person>() .Map<Student>(s => s.Requires("type").HasValue("student")) .Map<Teacher>(m => m.Requires("type").HasValue("teacher")); base.OnModelCreating(modelBuilder); }
Entity Framework with MySQL 學習筆記一(繼承)