实体框架无法获取子元素

时间:2018-05-01 19:16:59

标签: entity-framework sqlite entity-framework-6

我有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:&#39;指定的包含路径不是   有效。 EntityType&#39; SQLiteDemo.Models.CardHolder&#39;没有声明   导航属性,名称为&#39; AccessCard&#39;。&#39;

enter image description here

如果我用

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

我收到另一个错误:

  

SQL逻辑错误没有这样的列:Extent2.CardHolder_CardHolderId

实体框架有什么问题?

问题2:为什么我不能在Include语句中使用箭头功能,它根本不编译?

enter image description here

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

问题3:如果我的ICollection关联属性AccessCards不是虚拟的,那么为什么我需要完全使用Include - 这意味着急切加载必须单独工作!

为什么这么有问题和马车?没有什么能起作用:(

1 个答案:

答案 0 :(得分:1)

1 - 你已经确定了一个拼写错误:)

1B - &#34; SQL逻辑错误没有这样的列:Extent2.CardHolder_CardHolderId&#34;

EF没有找到你的FK。您可以将其添加到您的AccessCard模型中:

public int CardHolderId { get; set; }

2 - 你需要引入LINQ扩展。确保在顶部使用这两个语句:

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

3 - 你和许多其他人一样,误解了lazy loading。急切加载仍需要Include()来获取相关数据。延迟加载仅在您访问它们时获取关系。