Как я могу заполнить поле FK с помощью EF Code First? - PullRequest
0 голосов
/ 11 июня 2011

У меня есть класс Mailout с Status, который выглядит следующим образом:

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

Когда я вставляю Mailout и устанавливаю свойство Status, они вставляются правильно.Когда я их получаю, статус всегда равен нулю.Так как у меня нет (и я не хочу) идентификатора статуса в моем классе Mailout, у меня нет возможности получить его по факту.Как я могу сказать EF заполнять это поле с нетерпением, а не лениво?

Я надеюсь, что могу что-то настроить в OnModelCreating (), так как я хочу это поведение постоянно, а не как вариант, который я могуиспользовать иногда, манипулируя моими запросами LINQ-to-Entities.

Ответы [ 3 ]

3 голосов
/ 11 июня 2011

Вам нужно сделать ваши свойства навигации виртуальными.

0 голосов
/ 12 января 2012

Взятие из Информация о сотруднике 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; }
}
0 голосов
/ 11 июня 2011

В ModelBuilder нет такой опции для настройки автоматической активной загрузки свойств навигации в каждом запросе. Вы должны указать это запрос за запросом. В качестве обходного пути вы можете инкапсулировать нетерпеливую загрузку в некоторый метод или свойство, например в контексте:

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.

Только идея, она не проверена.

...