【问题标题】:new dbcontext returns all data in database?新的 dbcontext 返回数据库中的所有数据?
【发布时间】:2017-06-03 17:58:09
【问题描述】:

我是 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 分析器
  • 任何深层内部结构,IL

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

  • .Web(MVC5、DI、部署启动
  • .Domain(POCO 类)
  • .Data.Read(ReadDbContext、ReadDAO、EF 迁移、designtime-startup
    • 使用 LocalDB 实例
  • .Data.Write (WriteDbContext, WriteDAO)

在 Data.Read 项目中,当设置为启动时,Main 类具有以下“播放代码”,断点为:

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

【问题讨论】:

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


    【解决方案1】:

    为什么我的 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();
    }
    

    【讨论】:

    • 非常感谢!问题 2 的基础是“相信我说谎的眼睛”,但感谢您提供的更多细节!我会从你的例子中得到我的答案#2:“调试时只看'table'、'otherTable'、'query'、'result',而忽略'context'”
    猜你喜欢
    • 2021-08-11
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2019-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-22
    相关资源
    最近更新 更多