如何使用EF Code First填充FK字段?

时间:2011-06-10 21:53:04

标签: entity-framework-4.1 ef-code-first code-first

我有一个Mailout类,其状态如下所示:

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;}
}

当我插入邮件并设置Status属性时,它们会正确插入。当我获取它们时,Status始终为null。由于我没有(并且不想要)我的Mailout类上的状态ID,因此我无法在事后检索它。我如何告诉EF热切地填充这个字段,而不是懒惰?

我希望我可以在OnModelCreating()中设置一些内容,因为我一直想要这种行为,而不是我有时可以通过操作LINQ-to-Entities查询来使用它。

3 个答案:

答案 0 :(得分:3)

您需要将导航属性设为虚拟。

答案 1 :(得分: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.

只有一个想法,它没有经过考验。

答案 2 :(得分: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; }
}