2013-11-25 19 views
4

我從NHibernate的轉換項目,實體框架6如何通過導航屬性訪問外鍵ID屬性時避免延遲加載?

鑑於這個簡單的模型的過程是:通過組織導航屬性

public class User 
{ 
    public int ID { get; set; } 
    public string FullName { get; set; } 
    public virtual Organization Organization { get; set; } 
    // [...] 
} 

public class Organization 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public virtual List<User> Users { get; set; } 
    // [...] 
} 

訪問主鍵(ID),將導致整個組織實體被加載到上下文:

foreach(var user in db.Users) 
    Console.WriteLine(user.Organization.ID); 

鑑於OrganizationID外鍵是用戶行的一部分,我應該能夠在不造成整個的延遲加載來訪問它實體(實際上,NHibernate做到了這一點)。

由於缺少將外鍵ID的屬性添加到所有100多個實體中,所以我可以在不加載實體的情況下訪問它們的值,是否有任何措施可以避免此行爲?

編輯:此外,即使做一個空檢查將導致組織實體(不NHibernate的)的負載:

foreach(var user in db.Users) 
    Console.WriteLine(user.Organization != null); 

我想這是由於在途中實體代理的根本分歧在這兩個框架中實施。所以我必須將我的所有代碼適應這種令人沮喪的行爲......除非有人已經經歷過這個並且能夠啓發我?

+0

你好ECC-Dan,你是怎麼設法最終解決這個問題的?我面臨同樣的問題,我不想爲每個導航屬性添加ID。 – Khronos

+0

對不起,延遲迴復;我從來沒有解決這個問題,因爲與NHibernate相比,我們實際上最終放棄了對Entity Framework的轉換,因爲這個和其他更嚴重的限制。 –

回答

1

不需要,你需要將它們作爲屬性添加到你的類中(也就是說,如果你想要它強類型的話)就可以直接訪問它。

public class User 
{ 
    public int ID { get; set; } 
    public string FullName { get; set; } 

    //added ID  
    public int OrganizationID { get; set; } 
    public virtual Organization Organization { get; set; } 
    // [...] 
} 

通過訪問int你會防止延遲加載,EF將ID通過命名約定綁定。話雖如此:100多個班級......:|

更新:

正如我剛剛意識到的那樣;你可能想嘗試:

db.Users 
     .Include("Organization.ID") 
     .Where(/*your stuff*/) //etc.; 

我不確定它是否會完全加載嵌套屬性。如果沒有,這可能是一個小的性能增益。

+1

這就是我所害怕的。哦,我是什麼讓自己進入! –

+0

@ ECC-Dan:也可能有一種非強類型的方式。但我目前沒有這方面的知識。 – Stefan

+0

將屬性添加到類是一回事,修改所有業務代碼是另一回事。你用非強類型的方式意味着什麼?無論如何,我認爲這不會讓我不必修改所有的代碼...... –