Entity Framework - 运行 对 cloned/cached 数据库集的查询
Entity Framework - running queries on a cloned/cached DBset
我正在使用继承自 System.Data.Entity.DbContext
的上下文对象:
public class MyDbContext : DbContext
{
public MyDbContext()
{
Database.SetInitializer<MyDbContext>(null);
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new MyObjectConfiguration());
}
public DbSet<MyObjectClass> MyObject{ get; set; }
}
这是我使用 dbset
:
的代码
using (var context = new MyDbContext())
{
IQueryable<MyObjectClass> myQueryable = context.MyObject();
}
我想在 myQueryable
上 运行 查询,但我不希望它在数据库本身上 运行 - 我希望它在本地 运行缓存一个(每XXX次刷新一次)。
实现该目标的最佳方法是什么?
您可以使用 context.MyObject.Local
,但它是 IEnumerable。
为保持简单,您可以对上下文的使用方式进行小幅调整。
public void Main ()
{
// Cached collection...
IQueryable<ItemClass> items;
using ( context = _factory.CreateContext () )
{
items = context.Set<ItemClass> ()
// Don't track the items returned by this query.
.AsNoTracking()
// Select all items.
.Select ( e => true )
// This will create a HashSet and populate it with the query results.
.ToHashSet ()
// Cast HashSet to IQueryable
.AsQueryable ();
} // context gets disposed but we can still query the HashSet we created.
// items is still in scope query it without making additional database queries.
}
根据您的目标和相关数据量,您还可以考虑定期将数据同步到内存数据库之类的东西,以便您的应用程序可以 运行 针对内存副本进行一般查询。 (快速)如果数据跟踪最后修改的时间戳,后台进程可以运行保持两个数据源之间的变化同步。
从那里我会通过对缓存数据副本的整合检查来支持这一点,以报告任何可能不同步的数据,并有一个过程来记录增量异常并强制刷新整个缓存。
我正在使用继承自 System.Data.Entity.DbContext
的上下文对象:
public class MyDbContext : DbContext
{
public MyDbContext()
{
Database.SetInitializer<MyDbContext>(null);
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new MyObjectConfiguration());
}
public DbSet<MyObjectClass> MyObject{ get; set; }
}
这是我使用 dbset
:
using (var context = new MyDbContext())
{
IQueryable<MyObjectClass> myQueryable = context.MyObject();
}
我想在 myQueryable
上 运行 查询,但我不希望它在数据库本身上 运行 - 我希望它在本地 运行缓存一个(每XXX次刷新一次)。
实现该目标的最佳方法是什么?
您可以使用 context.MyObject.Local
,但它是 IEnumerable。
为保持简单,您可以对上下文的使用方式进行小幅调整。
public void Main ()
{
// Cached collection...
IQueryable<ItemClass> items;
using ( context = _factory.CreateContext () )
{
items = context.Set<ItemClass> ()
// Don't track the items returned by this query.
.AsNoTracking()
// Select all items.
.Select ( e => true )
// This will create a HashSet and populate it with the query results.
.ToHashSet ()
// Cast HashSet to IQueryable
.AsQueryable ();
} // context gets disposed but we can still query the HashSet we created.
// items is still in scope query it without making additional database queries.
}
根据您的目标和相关数据量,您还可以考虑定期将数据同步到内存数据库之类的东西,以便您的应用程序可以 运行 针对内存副本进行一般查询。 (快速)如果数据跟踪最后修改的时间戳,后台进程可以运行保持两个数据源之间的变化同步。
从那里我会通过对缓存数据副本的整合检查来支持这一点,以报告任何可能不同步的数据,并有一个过程来记录增量异常并强制刷新整个缓存。