我对.AsNoTracking()扩展名有疑问,因为这都是很新的,也很令人困惑。
.AsNoTracking()
我正在为网站使用每个请求的上下文。
我的许多实体都不会更改,因此不需要跟踪,但是在以下情况下,我不确定数据库的内容,甚至在这种情况下是否会有所不同。
这个例子是我目前正在做的:
context.Set<User>().AsNoTracking() // Step 1) Get user context.Set<User>() // Step 2) Update user
与上面相同,但是.AsNoTracking()从步骤1中删除了:
context.Set<User>(); // Step 1) Get user context.Set<User>() // Step 2) Update user
步骤1和步骤2使用相同的上下文,但发生在不同的时间。我无法解决的是是否有任何区别。由于第2步是更新,因此我猜两者都将两次访问数据库。
谁能告诉我有什么区别?
区别在于,在第一种情况下,上下文不跟踪检索到的用户,因此当您要将用户保存回数据库时,必须附加它并正确设置用户状态,以便EF知道它应该更新现有用户而不是插入一个新的。在第二种情况下,如果使用相同的上下文实例加载和保存用户,则无需这样做,因为跟踪机制会为您处理该情况。