gpt4 book ai didi

entity-framework - Entity Framework 跟踪的开销是多少?

转载 作者:行者123 更新时间:2023-12-04 08:30:52 26 4
gpt4 key购买 nike

我刚刚和一位同事讨论了 Entity Framework 变更跟踪。我们最终发现我的上下文接口(interface)应该有

IDBSet<MyPoco> MyThings { get; }

而不是

IQueryable<MyPoco> MyThings { get; }

并且我的 POCO 还应该具有所有属性,如 virtual .

然后使用调试器我们可以看到跟踪对象,并且结果还包含我实际 POCO 的代理。

如果我没有我的 POCO 属性 virtual并让我的上下文界面使用 IQueryable<>而不是 IDbSet<>我什么都不懂。

在这种情况下,我只查询数据库,但将来会希望通过 Entity Framework 更新数据库。

因此,为了让我将来查看此代码作为引用时的生活更轻松,当我永远不会使用它们时,将跟踪信息/代理放在那里是否会降低性能?

最佳答案

在 EF 中跟踪实体会降低性能。当您使用 Entity Framework 进行查询时,EF 将保留从数据库加载的值的副本。单个上下文实例也仅跟踪实体的单个实例。因此 EF 在创建实例之前必须检查它是否已经拥有实体的副本(即,在幕后会有很多比较)。

所以如果你不需要它就避免它。您可以按如下方式进行操作。

IQueryable<MyPoco> MyThings { get { return db.MyThings.AsNoTracking(); } }

MSDN 页面 Stages of Query Execution详细说明与查询执行的每个步骤相关的成本。

编辑:

你不应该公开 IDBSet<MyPoco> MyThings因为这会告诉您的 API 的使用者您的实体可以被添加、更新和删除,而实际上您打算查询数据。

关于entity-framework - Entity Framework 跟踪的开销是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8257523/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com