相关疑难解决方法(0)

EF 4.3.1和EF 5.0 DbSet.Local比实际的数据库查询慢

我有一个包含大约16,500个城市的表的数据库,以及该数据库的EF数据模型(数据库优先).我用代码将它们预加载到内存中:

Db.Cities.Load()
Run Code Online (Sandbox Code Playgroud)

...然后在使用它们的时候,我尝试了以下每个查询:

Dim cities() As String = Db.Cities.Select(Function(c) c.CityName).ToArray

Dim cities() As String = Db.Cities.Local.Select(Function(c) c.CityName).ToArray
Run Code Online (Sandbox Code Playgroud)

第一个查询是快速的(约10毫秒),但是第二个查询第一次运行大约需要2.3秒(尽管它比第一个查询在此之后调用时更快).

这没有意义,因为SQL Server Profiler验证第一个查询是在另一台机器上命中数据库,但第二个查询不是!

我试过关掉Db.Configuration.AutoDetectChangesEnabled,我试过预先生成视图.

我能做些什么来.Local加快速度?(并非所有运行此应用程序的客户端都将位于快速LAN上.)

.net vb.net entity-framework entity-framework-5 entity-framework-4.3.1

20
推荐指数
3
解决办法
2758
查看次数

DbSet<TEntity>.Local 与 DbContext.ChangeTracker

另一篇文章中,我要求澄清何时使用DbSet<TEntity>.Local. 我还没有得到答案,我认为这个问题可能包含太多信息。深入挖掘后,我可以提出一个更具体的问题。

希望你们能够解释在我的场景中选择两个选项中的哪一个。

我想实现什么目标?

  1. 我正在尝试从我的Repository. 这些实体仍处于“已添加”状态(即我尚未调用该SaveChanges方法)。我需要这个,因为我想将实体存储在一个原子操作中,所以我必须推迟调用,SaveChanges直到验证完整的模型之后。

  2. 此外,我需要符合 IQueryable 接口,因为我有使用扩展方法来延迟加载导航属性的依赖Include代码Queryable

我尝试了什么?

过去几天发生了很多事情,但归结为以下两种不同的方法:

  • 通过以下方式检索处于“已添加”状态的实体DbSet<TEntity>.Local通过属性
  • 通过以下方式检索处于“已添加”状态的实体DbContext.ChangeTracker

可视化不同方法的代码示例

    public void AddAndRetrieveUncommittedEntityFromDbContext()
    {
        Database.SetInitializer(new DropCreateDatabaseAlways<TestContext>());
        var testContext = new TestContext();

        // Initialize the entities and store them in the repository
        var tenant = new Tenant { Name = "test", Guid = Guid.NewGuid().ToString() };
        var user = new User { Name = "bas", EmailAddress = "bas@domain.com", Password = …
Run Code Online (Sandbox Code Playgroud)

c# entity-framework repository dbcontext

5
推荐指数
1
解决办法
3228
查看次数