2011-06-10 17 views
0

我有一個類Mailout一個狀態看起來像這樣:如何使用EF Code First填充FK字段?

public class Mailout 
{ 
    public int Id {get; set; } 
    public string Name {get; set; } 
    public MailoutStatus Status { get; set; } 
} 
public class MailoutStatus 
{ 
    public int Id { get; set; } 
    public string Name { get; set;} 
} 

當我插入Mailouts並設置狀態屬性,它們被正確地插入。當我獲取它們時,Status始終爲空。由於我沒有(也不想要)我的Mailout類的狀態ID,因此我無法在事後檢索它。我如何告訴EF熱切地填充這個領域,而不是懶惰?

我希望我可以在OnModelCreating()中設置一些東西,因爲我一直想要這種行爲,而不是我有時可以通過操縱我的LINQ-to-Entities查詢來使用的選項。

回答

3

您需要讓導航屬性爲虛擬。

+0

...用於預先加載? – Slauma 2011-06-10 23:57:21

+0

@Slauma:沒有。懶惰加載正常工作,而不是返回null。你可以使用'Include(x => x.Property)'進行急切的加載。 – 2011-06-11 00:58:59

+0

這更多的是一個修辭問題;)因爲他在問題中表示他不想使用延遲加載但急切加載。製作道具虛擬無助於此。 – Slauma 2011-06-11 12:01:24

0

模型構建器中沒有這樣的選項來配置每個查詢中導航屬性的自動加載。你必須通過查詢指定它的查詢。作爲一種變通方法,你可以封裝在某些方法或屬性預先加載,例如在上下文:

public class MyContext : DbContext 
{ 
    public DbSet<Mailout> Mailouts { get; set; } 
    public IQueryable<Mailout> MailoutsWithStatus 
    { 
     get { return Mailouts.Include(m => m.Status); } 
    } 
    // ... 
} 

,然後在查詢中使用:

context.MailoutsWithStatus.Where(...) ... etc. 

只有一個想法,這是未經測試。

0

Employee Info Starter Kit以 - 即將舉行的MVC版本,這裏是一個片段,使用時非常有效,躍躍欲試負載對象:

public class Employee 
{ 
    ... 
    public int? ReportsTo { get; set; } 

    [ForeignKey("ReportsTo")] 
    public virtual Employee Supervisor { get; set; } 

    /// <summary> 
    /// Children object collection of foreign key relation 
    /// </summary> 
    public virtual List<Employee> Subordinates { get; set; } 
}