.NET Core 2 EF,对象引用为空

时间:2018-02-13 10:43:33

标签: c# entity-framework

我第一次开始使用.NET Core 2和数据库,并查看了例如:Getting Started with EF Core on .NET Core Console App with a New database的示例。 我有一些模型,比如

public class BloggingContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }
}

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }

    public List<Post> Posts { get; set; }
}

public class Post
{
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

    public int BlogId { get; set; }
    public Blog Blog { get; set; }
}

但是,如果我加载一个对象,例如Post post = context.Post.SingleOrDefault(s => s.PostId == id),则post.Blog为空。但是,如果我在从数据库中读取之前,在调试器中展开context.Blogs,则在使用上述命令从数据库读取后,post.Blog是一个有效对象。

所以感觉我需要从数据库中读取博客来加载这些博客,以便Post的引用是正确的。这样做的正确方法是什么?

第二个问题:如何从任何地方获取数据库上下文?我是否应该在构造函数中设置一个连接字符串并默认创建新上下文的默认构造函数?

3 个答案:

答案 0 :(得分:4)

请点击此处查看详细说明:https://docs.microsoft.com/en-us/ef/core/querying/related-data

以上链接中的一些示例:

急切加载

using (var context = new BloggingContext())
{
    var blogs = context.Blogs
        .Include(blog => blog.Posts)
        .ToList();
}

明确加载

using (var context = new BloggingContext())
{
    var blog = context.Blogs
        .Single(b => b.BlogId == 1);

    context.Entry(blog)
        .Collection(b => b.Posts)
        .Load();
}

延迟加载尚不支持。它应该在v2.1中出现。

答案 1 :(得分:1)

为了保持此更新以供将来参考,EF Core现在支持延迟加载。

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

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
    .UseLazyLoadingProxies()
    .UseSqlServer(myConnectionString);

这应该可以解决问题。

答案 2 :(得分:0)

EF Core不支持延迟加载。您需要使用.Include

来急切加载对象

首次调用Blog时它起作用的原因是该对象在上下文缓存中可用,因此它能够成功填充Blog对象。