【问题标题】:EF 4 refresh dataEF 4 刷新数据
【发布时间】:2013-08-06 10:47:34
【问题描述】:

我有一个类似这样的实体:

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

【问题讨论】:

    标签: .net c#-4.0 entity-framework-4


    【解决方案1】:

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

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

    请注意,通过禁用更改跟踪,您可以有效地 关闭对象缓存。当您查询实体时,我们不能 通过拉取先前物化的查询来跳过物化 来自 ObjectStateManager 的结果。如果你反复查询 对于相同上下文中的相同实体,您实际上可能会看到 启用变更跟踪可提高性能。

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

    删除链接查询的.AsNoTracking()

    【讨论】:

    • 即使在删除 .AsNoTracking() 之后,它仍然会从缓存中读取数据并且不会反映数据库中的日期。
    • 我使用上面的代码,效果很好。这可能取决于您在上下文中输入数据的方式。执行插入时,您使用 _dbContext.Customers.Add (customer) .... 还是通过 SQLComand 执行插入?
    • 我已经在数据库中手动插入了记录,如何刷新上下文?
    • 在我的上下文中,我使用值为 true 的 context.Configuration.AutoDetectChangesEnabled。检查这个。如果没有解决,请检查这个答案:stackoverflow.com/questions/5799737/…
    • 嗨,你能帮我解决这个问题吗?我必须使用原始 sql 查询 var result = _dbContext.Database.SqlQuery("select ID, NAME, DB_FIELD from eis_hierarchy").ToList();但没有正确获得输出
    猜你喜欢
    • 2011-08-28
    • 2017-12-10
    • 1970-01-01
    • 1970-01-01
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多