兒童

2014-12-07 261 views
0

的實體框架負荷特性,我有以下結構:兒童

public class A{} 

public Class B:A 
{ 
    public virtual C { get; set;} 
} 

public Class C{} 

public Class Context:DbContext 
{ 
    public DbSet<A> As { get; set; } 
    public DbSet<C> Cs { get; set; } 
} 

當我想要加載任何物體b,這個對象的屬性C爲null。在數據庫中,C列在表格中有一個用於A的ID。其他intstring屬性可以毫無問題地加載。

using(var ctx = new Context()) 
{ 
    B b = ctx.As.FirstOrDefault() as B; 
} 

我可以使用延遲加載來解決這個問題嗎?使用急切加載我有一個問題,包括屬性B,因爲我有一個列表List<A> someAs其中一些項目是從B類型。

我試着讓這個例子儘可能簡單。請告訴我提供更多信息。

回答

1

如果你想急切地加載一個子類的屬性,你必須明確地查詢子類:

ctx.As.OfType<B>().Include(b => b.Cs).FirstOrDefault(); 
+0

啊完美。我認爲這將做到我想要的。我明天會試試這個,告訴你它是否有效。一個問題:爲什麼在這種情況下延遲加載不起作用? – jasdefer 2014-12-07 21:05:24

+0

哦,如果您將'A'轉換爲'B',延遲加載也可以工作,但IMO預先加載是首選方法。 – 2014-12-07 21:09:16

+0

它的工作原理。非常感謝你。我無法使用延遲加載工作。我不想使用它,但我很好奇。我應該如何將'A'投給'B'。我試過:'a a = ctx.As.FirstOrDefault();'然後'B b =(B)a',但是這不起作用。 – jasdefer 2014-12-08 06:19:58

0

您可以繼續使用延遲加載並使用.Include()指定加載子關係。 例子:

using (var context = new BloggingContext()) 
{ 
    // Load all blogs and related posts 
    var blogs1 = context.Blogs 
         .Include(b => b.Posts) 
         .ToList(); 

    // Load one blogs and its related posts 
    var blog1 = context.Blogs 
         .Where(b => b.Name == "ADO.NET Blog") 
         .Include(b => b.Posts) 
         .FirstOrDefault(); 

    // Load all blogs and related posts 
    // using a string to specify the relationship 
    var blogs2 = context.Blogs 
         .Include("Posts") 
         .ToList(); 

    // Load one blog and its related posts 
    // using a string to specify the relationship 
    var blog2 = context.Blogs 
         .Where(b => b.Name == "ADO.NET Blog") 
         .Include("Posts") 
         .FirstOrDefault(); 
} 

看看這篇文章: http://msdn.microsoft.com/en-us/data/jj574232.aspx

+0

謝謝爲答案。我不能使用'ctx.As.Include(x => x.C)',因爲它不是'A'的屬性。我有繼承的問題,而不是通常急切加載。或者我錯過了什麼? – jasdefer 2014-12-07 19:21:41