Entity Framework не может получить дочерние элементы - PullRequest
0 голосов
/ 01 мая 2018

У меня есть база данных SQLite и эти модели EF и контекст.

Модели и контекст

public class CardHolder
{
    public int CardHolderId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string PhoneNumber { get; set; }
    public string EmailAddress { get; set; }
    public string TenantName { get; set; }
    public ICollection<AccessCard> AccessCards { get; set; }
}

public class AccessCard
{
    public int AccessCardId { get; protected set; }
    public CardHolder CardHolder { get; set; }
    public DateTime ActivationDate { get; protected set; }
    public bool ActivationProcessed { get; set; }
    public DateTime? DeactivationDate { get; protected set; }
    public string DeactivationReason { get; set; }
    public bool DeactivationProcessed { get; set; }
}

public class MyContext : DbContext
{
    public DbSet<CardHolder> CardHolders { get; set; }
    public DbSet<AccessCard> AccessCards { get; set; }
}

А Основная программа

class Program
{
    static void Main(string[] args)
    {
        using (var db = new MyContext())
        {
            var cardHolders = db.CardHolders.Include("AccessCard").ToList();
        }
    }
}

Вопрос1: Почему я получаю это исключение

System.InvalidOperationException: 'Указанный путь включения не является действительный. EntityType 'SQLiteDemo.Models.CardHolder' не объявляется свойство навигации с именем 'AccessCard'. '

enter image description here

Если заменить его на

var cardHolders = db.CardHolders.Include("AccessCards").ToList();

Я получаю еще одну ошибку:

Ошибка логики SQL: такой столбец отсутствует: Extent2.CardHolder_CardHolderId

Что не так с Entity Framework?

Вопрос2: Почему я не могу использовать функцию стрелки в операторе включения, она вообще не компилируется?

enter image description here

var cardHolders = db.CardHolders.Include(x => x.AccessCards).ToList();

Вопрос 3. Почему вообще нужно использовать «Включить», если свойство AccessCards моей ассоциации ICollection НЕ является виртуальным - это означает, что активная загрузка должна работать сама по себе!

Какого черта это так проблематично и глючит? Ничто не работает так, как должно: (

1 Ответ

0 голосов
/ 03 мая 2018

1 - У вас есть опечатка, как вы уже определили:)

1B - «Ошибка логики SQL: нет такого столбца: Extent2.CardHolder_CardHolderId»

EF не находит ваш FK. Вы можете добавить его к своей модели AccessCard:

public int CardHolderId { get; set; }

2 - Вы должны добавить расширения LINQ. Удостоверьтесь, что у вас есть оба этих оператора использования вверху:

using System.Data.Entity;
using System.Linq;

3 - Вы, как и многие другие, неправильно понимаете ленивая загрузка . Для активной загрузки по-прежнему требуется Include() для извлечения связанных данных. Ленивая загрузка извлекает отношения только при доступе к ним.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...