網頁

Code First "Virtual" 的用處 // Understanding code first virtual properties

一開始在學習 Code First 時會發現 "virtual" 都放在 List<> 前面,而小弟也相當疑惑,於是查了資料之後整理如下:


Code First 時 應該對 "多" 的屬性設置一個 List < >
因為在runtime 時 VS2013會繼承你的 Class 然後 override 所有 virtual 的程式碼 ,以達到"Lazy Load"和"change tracking"的效果

(註:Lazy Load是可以將還沒要用到的資料等要用到時再載入
change tracking則是讓系統可以知道相關的資料哪些被改變了)


這裡以 一 (Genre) 對上 多(Album)來舉例:
(也就是一個Genre裡會有很多Album) 

public class Genre 
    {
        [ Key]
        public int GenreId { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }       
        public virtual List< Album> Albums { get; set; }
        
       或: public List <Album > Albums { get; set; }
    }

而有沒有加 virtual 的在Coding時差別如下:

假設今天要撈出Genre.Name屬性為"genre"的Album

  • 有加 virtual 
var genreModel = storeDB.Genres.Single(g => g.Name == "genre");




  • 不加 virtual 在使用linq 語法時,應該要用Include( "Albums")方法才能將底下的albums集合一起撈出來
var genreModel = storeDB.Genres.Include( "Albums")
                .Single(g => g.Name == "genre");

也就是有virtual的 storeDB.Genres = 沒有virtual時的 storeDB.Genres.Include( "Albums")


今天介紹就到這裡了,希望能幫助到有這個疑問的朋友

沒有留言:

張貼留言

Related Posts Plugin for WordPress, Blogger...