EF Core 在 DBset 上没有 .Include() 方法。

42

目前我完全无法调用 .Include() 并且智能提示(在 vscode 中)似乎认为它不存在。

现在,在长时间搜索网络后,我找到了这个:

Not finding .Include() method in my EF implementing Generic repository

它似乎表明 .Include 只存在于 System.Data.Entities 中,而该程序集仅适用于 EF 5 和 6。

那么我应该如何在 EF Core 中急切加载实体的列表属性呢?

这是我的上下文:

public class Database : DbContext
{
    //Set new datasources like this: public DbSet<class> name { get; set; }

    public DbSet<Domain.Resource> Resources { get; set; }
    public DbSet<Domain.ResourceType> ResourceTypes { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlite("Filename=./something.db");
    }
}

这里是数据类:

public class Resource
{
    public int ResourceId { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }

    public int ResourceTypeId { get; set; }
    public ResourceType ResourceType { get; set; }
}
public class ResourceType
{
    public int ResourceTypeId { get; set; }
    public string Name { get; set; }

    public List<Resource> Resources { get; set; }
}

然后我做了类似这样的事情:

public List<ResourceType> GetAll()
{
    var router = new Database();

    var result = router.ResourceTypes.Include(rt => rt.Resources); //It's here there's absolutely no .Include method

    return result.ToList();
}

在EF Core中没有.Include吗?


6
你是否在错误信息上按下了 Ctrl+.,这样Visual Studio 2015/2017就会建议你使用 Microsoft.EntityFrameworkCore 命名空间了吗? ;) - Tseng
我在Ubuntu上使用Visual Studio Code。 - rasmus91
1
只需添加 using Microsoft.EntityFrameworkCore; 并在上面编写代码。即使智能感知无法找到它,它也应该可以正确编译。 - Smit
可能是重复的问题:Entity Framework Core不包含“Include”的定义 - Michael Freidgeim
3个回答

88

这是因为在我调用该方法的文件中缺少引用,这是一个直接的后果(虽然我不太确定我理解得如何...)

无论如何,加上:

using Microsoft.EntityFrameworkCore;

就像 TsengSmit 建议的那样,在我定义函数的文件中做了手脚。

但是为什么这样会起作用,我不知道。我以为 .include 应该通过 DbSet 自动可用。

不过还是谢谢!:)

小小的修改:正如 Christian Johansen 在他的评论中指出的那样,需要导入才能看到方法签名的原因是它是一个扩展方法,我强烈鼓励任何初学 C# 的开发者学习它,因为它非常有用。


5
这个方法是作为扩展方法实现的,因此直到你包含了该扩展方法所在的命名空间,它才会变得可见。 - Christian Johansen

11
如果你到达这里,并且是 EF 6 或更低版本的用户,而且恰好像我一样错过了 OP 实际上提到了这个,那么你想要添加

如果你到达这里,并且是 EF 6 或更低版本的用户,而且恰好像我一样错过了 OP 实际上提到了这个,那么你想要添加

using System.Data.Entity;

致你的班级。


1
为什么VS没有像其他LINQ方法一样建议我使用它,这非常不直观,很难猜到你会错过它。 - GeorgiG
1
很棒的问题@GeorgiG,我已经有一段时间没有深入研究它了,但我可能会因为这一直困扰着我。 - Mike Devenney
1
@GeorgiG - 一年后,我偶然又经过这个问题,并开始仔细研究了一下。不知道为什么去年你问这个问题并且我回答时,我没有想到这一点,或许是因为我没有考虑到吧。无论如何,由于它是一个扩展方法,在你添加它所属的命名空间之前是不会显示的。 - Mike Devenney

1

这里是一个之前的答案,跟踪了EF7中的这个问题。看起来现在已经被“包含”了。


很抱歉,但我不是在寻找启用.Include(string)的重载,而是.Include(t => t.property)。而且根据所有记录,这早在2015年就已经可用了,那么为什么我现在一点也无法访问呢?:( - rasmus91
它在这里:链接,从第2162行开始。VSCode的智能感知可能比常规的Visual Studio更有问题。我建议首先检查您是否安装了所有必要的扩展。 - trevorc
嗯,那我试试给它打个电话吧。EF Core 1.0及更高版本应该没问题,对吧。不过我得琢磨一下Intellisense是怎么了,因为目前我遇到的唯一问题就是重新命名一个类时……即便如此,只需要重新启动程序就能解决。 - rasmus91
1
尝试使用它,看看你的项目是否能够编译和运行。 - trevorc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接