Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我如何知道在实体框架中使用即时加载时是否包含相关数据?_C#_Entity Framework - Fatal编程技术网

C# 我如何知道在实体框架中使用即时加载时是否包含相关数据?

C# 我如何知道在实体框架中使用即时加载时是否包含相关数据?,c#,entity-framework,C#,Entity Framework,我正在从事一个使用存储库模式的项目。我们使用实体框架从数据库检索数据。要加载相关数据,我们使用渴望加载,这意味着我们必须显式地包含相关数据 假设我们想要所有的博客和它们的相关文章,我们必须写:_dbContext.blogs.includeb=>b.posts 这样做的缺点是,您只能看到存储库类中加载了哪些相关数据 我试着在下面展示一个例子。在这里,问题出现在BlogViewModel.cs类中,因为您试图访问blogs.Posts,但原始查询中不包括Posts。因此,如果您试图获取相关数据,则

我正在从事一个使用存储库模式的项目。我们使用实体框架从数据库检索数据。要加载相关数据,我们使用渴望加载,这意味着我们必须显式地包含相关数据

假设我们想要所有的博客和它们的相关文章,我们必须写:_dbContext.blogs.includeb=>b.posts

这样做的缺点是,您只能看到存储库类中加载了哪些相关数据

我试着在下面展示一个例子。在这里,问题出现在BlogViewModel.cs类中,因为您试图访问blogs.Posts,但原始查询中不包括Posts。因此,如果您试图获取相关数据,则必须检查查询的来源,并查看是否包含它

repostory.cs

服务中心

BlogViewModel.cs

有人对此有聪明的解决方案吗?如果您试图访问未包含的数据,是否可能出现编译错误

我考虑过的两个选择是:

改为使用延迟加载。 始终从存储库返回IQueryable
谢谢

不,您没有任何选项在此上下文中给出编译错误。任何一种方式的数据都会在运行时加载

懒散 假设您在视图中显示博客、帖子和评论,那么您需要在页面加载时加载所有内容。 启用数据层查询中未包含的lazyload和map特性时,将加载相关实体

public BlogViewModel(BlogDbModel blogDbModel) 
{
  Name = blogDbModel.Name;
  Posts = blogDbModel.Posts;
 }
如果您启用lazyload并执行此操作,则将使用lazyload功能获取此帖子。如果post包含对用户或任何其他对象的引用,它也会加载这些引用。 当您首先需要所有东西时,不建议使用lazyload,因为它会增加到数据库的往返

可从存储库中检索

我想说,一个视图模型的易读性是一种漏洞百出的抽象。理想情况下,您的数据层应该执行这些操作。向Viewmodel提供IQuerable类似于开发人员能够获取1Blogs=>Post=>User=>Accounts1与此相关的任何内容

我将编写视图所需的数据层方法

LazyloadingEnabled=false


当你在查询中包含帖子时,你能分享一段输出吗?[{Name:'johnys blog',posts:[{title:'life on the road}文本:'hello everybody…},{title:'Where am I}'文本:'So cool…]},{Name:'Chrisitinas place',posts:[...]}]这就是你所说的@Innominatum?:SYes,看看你的代码片段,帖子列表已加载但为空,BlogViewModel的数据和帖子有关系吗?我想我的问题可能解释错了@埃尔德霍明白了。谢谢你的尝试:好的。这是一个很好的观点。这种方法的问题是博客有十个相关的实体,它们又有一些实体。因此,必须在存储库中创建许多方法。GetBlogsAndPosts、GetBlogsAndPostsAndAuthors等。我想我的方法将是一个简单的GetBlogs端点和GetBlogsAndRelatedData端点。我认为GetBlogs总是需要作者、评论和喜欢的人。使用诸如GetBlogs这样的简单方法时,只返回blog是必需的。我会说写一些必要的方法。在开发中没有银弹,但权衡是否有最适合您的情况博客和帖子就是一个例子:。实际上,这是一件更无聊的事情:。再次感谢您提供有关延迟加载的参考想法
public IEnumerable<BlogViewModel> GetBlogs() {
  return _repository.Select(x => new BlogViewModel(x));
 }
public class BlogViewModel {
  public BlogViewModel(BlogDbModel blogDbModel) {
    Name = blogDbModel.Name;
    Posts = blogDbModel.Posts;
}

  public string Name { get; set;}

  public IEnumberable<Posts> Posts {get; set;}

}
public BlogViewModel(BlogDbModel blogDbModel) 
{
  Name = blogDbModel.Name;
  Posts = blogDbModel.Posts;
 }
public IEnumerable<BlogDbModel> GetBlogs()
{

    return _dbContext.Blogs.ToList();
}

public IEnumerable<BlogDbModel> GetBlogsAndPosts()
{

  return _dbContext.Blogs.Include("Posts").ToList();
}

//This will fetch only what is needed (You can customize to get columns what is needed)
public IEnumerable<NewCustomDTO> GetBlogsAndPostCount()
{

   return _dbContext.Blogs.Select(x=> NewCustomDTO
   {
       BlogName = x.BlogName,
       Count = x.Posts.Count(),
   });
}