2014-01-22 87 views
2

我有兩個對象類的EntityFramework和延遲加載

class Person 
{ 

    public int Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set;} 
    public DateTime BirthDate { get; set; } 
    public bool IsMale { get; set; } 
    public byte[] Image { get; set; } 
    public byte[] RowVersion { get; set; } 
    public virtual Person Parent { get; set; } 
    public virtual ICollection<PhoneNumber> PhoneNumber { get; set; } 
    public virtual ICollection<Address> Addresses { get; set; } 
    public virtual PersonInfo PersonInfo { get; set; } 

} 

和:

class PhoneNumber 
{ 

    public enum PhoneType 
    { Work, Mobile, Home }; 

    public int id { get; set; } 
    public string phoneNumber { get; set; } 
    public PhoneType phoneType { get; set; } 
    public virtual Person Person { get; set; } 
} 

我添加了「虛擬」的關鍵字,以我的導航性能,使惰性加載,然後我添加了一些代碼用於獲取列表的人:

using (var newContext = new MyDbContext()) 

    { 
     var selectedPerson = newContext.Persons.ToList(); 
    } 

但是,當我運行我的項目時,我得到PhoneNumber爲空! 我想如果我添加「虛擬」關鍵字到我的導航屬性,然後我得到PhoneNumber以及.. 我明白了嗎?

+0

你打開懶加載呢? – ivowiblo

+0

我認爲這足夠了,如果我添加「虛擬」關鍵字我的導航關鍵字,如:人和電話號碼! – pejman

+0

是的,你這樣想,但事實並非如此。 – ivowiblo

回答

2

我找到了解決辦法,我應該補充的公共修改到我的對象類別,使得:

Public class Person 
    { 

    public int Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set;} 
    public DateTime BirthDate { get; set; } 
    public bool IsMale { get; set; } 
    public byte[] Image { get; set; } 
    public byte[] RowVersion { get; set; } 
    public virtual Person Parent { get; set; } 
    public virtual ICollection<PhoneNumber> PhoneNumber { get; set; } 
    public virtual ICollection<Address> Addresses { get; set; } 
    public virtual PersonInfo PersonInfo { get; set; } 

    } 

和:

Public class PhoneNumber 
    { 

    public enum PhoneType 
    { Work, Mobile, Home }; 

    public int id { get; set; } 
    public string phoneNumber { get; set; } 
    public PhoneType phoneType { get; set; } 
    public virtual Person Person { get; set; } 
    } 
0

第一:我不知道這是否有什麼區別,但我已將配置我的導航屬性爲List<T>和延遲加載工程。

也許與ICollection<T> EF不會初始化這些集合,因爲它不知道用哪個具體的列表類型(只是猜測)

public virtual List<PhoneNumber> PhoneNumbers { get; set; } 

二:默認情況下,你沒有明確配置的東西,它應該開箱即用。總之,要確保不要禁用LazyLoadingEnabledProxyCreationEnabled

三:枚舉數據類型,因爲EF5與框架4.5(支持的,如果你仍然運行Framework 4.0中,你應該把它phoneType爲int

+0

謝謝..默認情況下在EntityFramework5中啓用了Lazy Loading和Proxy? – pejman

+0

是的,我認爲是。我從來沒有明確地設置這些值在我的配置,它的工作原理。你可以用'var person = context.Persons.Find(1);'檢查person.GetType()。名稱 - 它應該像'System.Data.Entity.DynamicProxies.Person_ABCBE0D1022D01EB84B81873D49DEECC60879FC4152BB115215C3EC16FB8003A'類似,即使沒有相關記錄可用,person.PhoneNumbers也應該是一個空列表。 –

0

你的代碼

using (var newContext = new MyDbContext()) 
{ 
    var selectedPerson = newContext.Persons.ToList(); 
} 

將永遠載入PhoneNumbers(或任何導航屬性),因爲你不Include他們。並且語句運行後的背景佈置,所以任何延遲加載的嘗試會拋出異常。

左右(假設你沒有設置任何LazyLoadingEnabledProxyCreationEnabled =虛假的背景下,禁用延遲加載。)您應包括的生命週期內的PhoneNumbers

var selectedPerson = newContext.Persons.Include(p => p.PhoneNumbers).ToList(); 

或解決一個人的PhoneNumbers集合上下文。 (這將執行額外的SQL查詢)。

+0

我認爲這足夠了,如果我添加「虛擬」到我的導航屬性,在您的代碼中,您需要這樣的東西:人加入電話,所以你明確做加載,它不是延遲加載。 – pejman

+0

不,這不是懶惰,但我也指出了延遲加載成功的條件。 –