我有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;
如果我用
替换它var cardHolders = db.CardHolders.Include("AccessCards").ToList();
我收到另一个错误:
SQL逻辑错误没有这样的列:Extent2.CardHolder_CardHolderId
实体框架有什么问题?
问题2:为什么我不能在Include语句中使用箭头功能,它根本不编译?
var cardHolders = db.CardHolders.Include(x => x.AccessCards).ToList();
问题3:如果我的ICollection关联属性AccessCards不是虚拟的,那么为什么我需要完全使用Include - 这意味着急切加载必须单独工作!
为什么这么有问题和马车?没有什么能起作用:(
答案 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()
来获取相关数据。延迟加载仅在您访问它们时获取关系。