0

我有一个这样的实体:

public class Customer
{
    public string Id { get; set; }
    public string Name { get; set; }
}

我正在使用 LinQ 阅读如下:

public IQueryable<Customer> GetCustomer()
{
    var result = from cust in _dbContext.Customers.AsNoTracking() select cust;
    return result;
}

第一次一切正常,但是当我在数据库中手动添加一个客户时,同一个客户没有反映在这个查询中,它总是返回旧记录。

那么我如何始终从 DB 获取更新的客户?

注意:我使用的是 EF 4

4

1 回答 1

0

问题是方法调用.AsNoTracking()AsNotracking() 方法是数据的分离列表,在 5.1 项中的链接http://msdn.microsoft.com/en-us/data/hh949853.aspx上进行验证说明了这一点:

如果您处于只读场景并希望避免将对象加载到 ObjectStateManager 中的开销,您可以发出“No Tracking”查询。可以在查询级别禁用更改跟踪。

请注意,通过禁用更改跟踪,您实际上是关闭了对象缓存。当您查询实体时,我们不能通过从 ObjectStateManager 中提取先前实现的查询结果来跳过具体化。如果您在相同的上下文中重复查询相同的实体,您实际上可能会看到启用更改跟踪带来的性能优势。

使用 ObjectContext 进行查询时,ObjectQuery 和 ObjectSet 实例一旦设置就会记住 MergeOption,并且在它们上组合的查询将继承父查询的有效 MergeOption。使用 DbContext 时,可以通过在 DbSet 上调用 AsNoTracking() 修饰符来禁用跟踪。

删除.AsNoTracking()链接查询

于 2013-08-06T12:39:38.200 回答