Entity Framework中的實體類型 : 在之前的章節中我們介紹過從已有的資料庫中創建EDM,它包含資料庫中每個表所對應的實體。在EF 5.0/6.0中,存在POCO 實體和動態代理實體兩種。 POCO Entity (Plain Old CLR Object): POCO類是不依賴任何框架 ...
Entity Framework中的實體類型 :
在之前的章節中我們介紹過從已有的資料庫中創建EDM,它包含資料庫中每個表所對應的實體。在EF 5.0/6.0中,存在POCO 實體和動態代理實體兩種。
POCO Entity (Plain Old CLR Object):
POCO類是不依賴任何框架的類型,如同其他正常的一般類型,我們稱之為"Plain Old CLR Objects"(這裡不知道怎麼翻譯,普通的CLR對象?古老的CLR對象?大概意思就是沒有什麼特殊的對象吧)。
POCO 實體(又名非持久化對象)是又EDM創建出來的支持查詢,插入,更新,刪除行為的實體類型。下麵是一個Student 的 POCO 實體
1 public class Student 2 { 3 public Student() 4 { 5 this.Courses = new List<Course>(); 6 } 7 8 public int StudentID { get; set; } 9 public string StudentName { get; set; } 10 public Nullable<int> StandardId { get; set; } 11 12 public Standard Standard { get; set; } 13 public StudentAddress StudentAddress { get; set; } 14 public IList<Course> Courses { get; set; } 15 } 16View Code
動態代理 (POCO 代理):
動態代理是POCO實體的運行時代理,它看起來先POCO實體的封裝類。動態代理實體允許懶載入和自動更改追蹤。
POCO實體滿足一下的條件即為POCO代理:
- POCO類必須被聲明為public
- POCO類不能為密封類
- POCO類不能為抽象類
- 每一個導航屬性必須被聲明為public,virtual
- 所有集合屬性必須是ICollection<T>類型的
- 在context 類中不能將ProxyCreationEnabled 設置成false (預設是true)
下麵 Student 的POCO實體滿足以上所有條件,那麼它將成為動態代理實體。
1 public class Student 2 { 3 public Student() 4 { 5 this.Courses = new HashSet<Course>(); 6 } 7 8 public int StudentID { get; set; } 9 public string StudentName { get; set; } 10 public Nullable<int> StandardId { get; set; } 11 12 public virtual Standard Standard { get; set; } 13 public virtual StudentAddress StudentAddress { get; set; } 14 public virtual ICollection<Course> Courses { get; set; } 15 }View Code
註意 : 預設情況下所有實體都允許動態代理,當然你也可以在context類中禁用它。
context.Configuration.ProxyCreationEnabled = false;
EDM預設創建的都是這類代理實體
在運行時Student的類型會變成System.Data.Entity.DynamicProxies.Student
從動態代理中獲取實際的類型 :
你可以通過ObjectContext.GetObjectType()方法從動態代理中獲取實際的類型
實體有兩種類型的屬性,標量屬性和導航屬性。
標量屬性:
標量屬性是實體中包含的實際值。例如,Student 實體中如StudentId 和 StudentName的屬性。這些對應Student 表中的列。
導航屬性:
導航屬性指向其他相關的實體。Student 類中有一個Standard 的導航屬性,它使應用程式能通過Student 關係到對應的Standard 實體中。