【问题标题】:AsNoTracking() in entityframework实体框架中的 AsNoTracking()
【发布时间】:2013-01-25 18:03:19
【问题描述】:

我用AsNoTracking(),知道一级缓存在使用的时候是禁用的。但是如何使用AsNoTracking() 来提高性能呢?使用它有什么好处?

【问题讨论】:

    标签: entity-framework


    【解决方案1】:

    AsNoTracking() 表示实体不会被 ObjectContext 实例本地缓存。这有一些实际的好处:

    1. 内存使用情况:由于 ObjectContext 在返回给您后并未引用实体,因此垃圾收集器可以在您不再引用实体后立即删除它们他们。通常,需要在这发生之前释放 ObjectContext。

    2. 性能:由于 EF 不必尝试将从数据库返回的每条记录与身份映射中的本地实体进行匹配,因此您的查询可能会执行得稍微快一些。

    3. 货币:由于查询返回的实体直接从数据库结果中具体化并且不依赖于本地缓存,因此返回的实体应始终反映数据库中的最新值。

    4. 无状态:由于 ObjectContext 不会跟踪实体,因此您可以继续无限期地使用相同的 ObjectContext 实例进行只读查询,而不必受到有关以下方面的常规建议的限制拥有短暂的 ObjectContexts。

    AsNoTracking() 是一个好主意,如果您只查询实体。如果您需要更新它们,它将无法工作,这就是权衡。

    【讨论】:

    • 无缓存 / AsNoTracking() 会使其变慢。来自文档:“如果您在相同的上下文中重复查询相同的实体,您实际上可能会看到启用更改跟踪带来的性能优势。”
    • 您的最后一段缺少一些额外信息。如果您只是在确定后获取该数据,但是如果您有一个复杂的页面并使用实体来分配其他将导致分配 SQL 执行的事情。您需要指定,if you're only querying entities **once**.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多