new dbcontext返回数据库中的所有数据?

时间:2017-01-19 06:12:43

标签: c# performance entity-framework-6 linq-to-entities dbcontext

我是EF和.Net的新手,没有任何我读过或搜索过的东西让我为我所看到的一切做好准备 - 感谢任何帮助!

问题1:为什么我的DbContext只是在实例化时充满了数据!?

(A#1:不是。只是调试器试图通过自动加载数据来帮助。)

原始问题2:如何通过我的显式查询将其实例化为空的“repo / container”对象以加载数据?

更好的问题2:调试时我应该注意什么?

(A#2:忽略DbContext对象并查看DbSet& Query对象。)

询问原因:

  • 在调试时,每个表的每一行都填充在dbcontext的Locals / ResultsView中。
  • 至少它返回的数据是正确的,但这将是一个真正的性能杀手:0

认为我已经排除了:

  • LazyLoading设置为false
  • 没有故意运行Linq查询
  • 缓存问题
    • 直接在db中删除数据会返回空的Locals / ResultsView。 (所以只要我的数据库没有数据就可以了:p)
  • 迁移/数据库不匹配
  • 类型不匹配

没看过:

  • Sql profiler
  • 任何深入的内部,IL

在.sln(VS2015社区)中有多个项目使用CQRS模式(EF6,MVC5,SimpleInjector)

  • .Web(MVC5,DI,部署启动
  • .Domain(POCO班级)
  • .Data.Read(ReadDbContext,ReadDAO,EF Migrations, designtime-startup
    • 使用LocalDB的实例
  • .Data.Write(WriteDbContext,WriteDAO)

在Data.Read项目中,当设置为启动时,Main类具有以下“Play-Code”,断点为:

using ( MyDbContext dbcontext = new MyDbContext() )
    {
    //BREAKPOINT:  Why is dbcontext full of data simply upon instantiation!?
    //(while Debugging, Every row, from every table, is populated in Locals/ResultsView of dbcontext)
    //No explicit Linq queries have been run

1 个答案:

答案 0 :(得分:0)

  

为什么我的DbContext只是在实例化时就充满了数据!?

DbContext不会加载数据。你的调试器。调试器允许您查看数据,当您查看数据时,DbContext将查询数据库。但它不会这样做。这可以使用SQL Server Profiler轻松测试。运行它,您将看到DbContext在您使用调试器查看数据库之前不会查询数据库。

  

如何让它实例化为空的" repo / container"对象   通过我的显式查询加载数据?

最简单的方法就是拿到桌子。

说你的DbContext看起来像这样:

public class MyDbContext : DbContext
{
    public DbSet<Customer> Customers {get; set;}
}

然后你可以这样得到你的容器:

using(var context = new MyDbContext())
{
    // Get the table. This can serve as your repository.
    DbSet<Customer> table = context.Customers;

    // If you're using generics you can do like this as well.
    DbSet<Customer> otherTable = context.Set<Customer>();

    // Specify your explicit query.
    IQueryable<Customer> query = table.Where(x => x.Name == 'Jenny');

    // Note that EF still haven't executed a query.
    // By calling methods like ToList() or FirstOrDefault() it will run the query.
    IList<Customer> result = query.ToList();
}