EntityFramework Core 1.1.0缺少Include()?

时间:2017-02-07 19:49:31

标签: c# entity-framework entity-framework-core

我正在使用EntityFramework Core 1.1.0。我可以查询表并加载实体,但Microsoft的指示表明我是否要加载关系数据,我应该使用Include函数:

https://docs.microsoft.com/en-us/ef/core/querying/related-data

  

您可以使用Posts方法指定要包含在查询结果中的相关数据。在以下示例中,结果中返回的博客将使用相关帖子填充其using (var context = new BloggingContext()) { var blogs = context.Blogs .Include(blog => blog.Posts) .ToList(); } 属性。

.Include()

我没有this.context.Mail .Include("Files") // This is missing 选项。

为什么缺少这个或者如何加载外键关系数据的任何想法?

var mails = this.context.Mail.ToList();
mails.ForEach(mail =>
{
    this.context.Entry(mail)              
    .Collection(m => m.Files)
    .Load();
});

我已经使用显式加载关系数据。这适用于小型结果集,但随着我的数据集的增长,这将让我感到悲伤。

A = matrix(c(1,0,1,1,1,1,0,0,1,1), nrow=2, ncol=5)
colnames(A)<-c("A","B","A","A","B")

   A B A A B
   1 1 1 0 1
   0 1 1 0 1

3 个答案:

答案 0 :(得分:19)

您是否包含了正确的命名空间?

From the repository linked in the documentation

using Microsoft.EntityFrameworkCore;
using System.Linq;

答案 1 :(得分:1)

我认为你的电话应该是:

this.context.Mail
    .Include(m => m.Files).ToList();

更详细的答案: 您需要首先确保正确形成MailFile模型,以便MailFile之间存在一对多的关系:

public class Mail
{
    public int MailId { get; set; }

    public virtual ICollection<File> Files { get; set; }
}

public class File
{
    public int FileId { get; set; }

    public int MailId { get; set; }
    public virtual Mail Mail { get; set; }
}

然后确保将MailFile DbSet包含在您的DbContext中:

public class MailingContext : DbContext
{
    public MailingContext(DbContextOptions options) : base(options)
    {
    }

    public DbSet<Mail> Mails { get; set; }
    public DbSet<File> Files { get; set; }

    protected override void OnModelCreating(ModelBuilder builder)
    {
    }
}

然后在您的控制器类或存储库类中,您可以创建一个方法来获取带有这样的文件的邮件:

public IList<Mail> GetMails()
{
    return _context.Mails.Include(m => m.Files).ToList();
}

public Mail GetMailById(int id)
{
    return _context.Mails.Include(m => m.Files).SingleOrDefault(m => m.MailId == id);
}

答案 2 :(得分:1)

添加命名空间以获取该选项。

using Microsoft.EntityFrameworkCore;

如果你还没有添加,

using System.Linq;

如果您启用了延迟加载,那么您甚至不需要使用include。