Настройка отношений в Entity Framework Core - PullRequest
0 голосов
/ 09 ноября 2018

Я пытаюсь установить отношение один ко многим в Entity Framework Core, используя Fluent API, но безуспешно.

У меня есть два объекта, которые называются Message и Source и определены как

public class Message
{
    public int ID { get; set; }
    public int FromUserID { get; set; }
    public int ToUserID { get; set; }
    public int SourceID { get; set; }
    public int Priority { get; set; }
    public string Subject { get; set; }
    public string MessageBody { get; set; }
    public DateTime DateTimeCreated { get; set; }
    public DateTime? DateTimeDelivered { get; set; }
    public Source Source { get; set; }
}

public class Source
{
    public int ID { get; set; }
    public string Name { get; set; }
    public ICollection<Message> Messages { get; set; }
}

с одним сообщением, относящимся к одному источнику, и одним источником, относящимся ко многим сообщениям.

В моем классе контекста у меня есть следующее

public DbSet<Message> Messages { get; set; }

public DbSet<Source> Sources { get; set; }

и затем определите отношение как

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    ...

    modelBuilder.Entity<Message>()
            .HasOne<Source>(m => m.Source)
            .WithMany(s => s.Messages);

}

Если я проверю это со следующим

var get = context.Messages.Where(m => m.ID == 1).FirstOrDefault();

Моя проблема в том, что я получаю данные, возвращенные для сообщения ОК, но для источника я получаю только ноль.

Я смотрел на различные учебные пособия и вопросы SOF по этому поводу, но я не вижу, в чем я ошибаюсь.

Надеюсь, кто-то может пролить свет на это.

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Добавьте Include(msg => msg.Source) к запросу, и это заставит его загрузить с сообщением var get = context.Messages.Include(msg => msg.Source).Where(m => m.ID == 1).FirstOrDefault();

0 голосов
/ 09 ноября 2018

Существует несколько способов загрузки связанных данных:

Стремительная загрузка:

означает, что связанные данные загружаются из базы данных как часть начального запроса

Явная загрузка:

означает, что связанные данные явно загружаются из базы данных позднее

Ленивая загрузка:

означает, что связанные данные прозрачно загружаются из базы данных при обращении к свойству навигации

Дополнительную информацию см. В EF Core документах .

Если мы используем подход с отложенной загрузкой, вы можете настроить параметры с помощью UseLazyLoadingProxies ():

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
    .UseLazyLoadingProxies()
    .UseSqlServer(myConnectionString);

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

public virtual Source Source { get; set; }

и

public virtual ICollection<Message> Messages { get; set; }
...