C# Entity Framework.First()缓存查询数据
根据实体框架文档,实体框架仅在使用C# Entity Framework.First()缓存查询数据,c#,.net,entity-framework-6,C#,.net,Entity Framework 6,根据实体框架文档,实体框架仅在使用.Find()查询数据时才会缓存数据 在下面的示例中,我使用.First()时缓存了查询数据: 为什么account2的余额是50?根据我的考虑,它应该是0 提前感谢使用AsNoTracking() 使用AsNoTracking() 您的TransactionScope必须在您的上下文中并开始交易 如果您像以前那样声明它们,那么您的上下文中就没有打开的事务 使用Celso Livero said等信息=> 使用另一个上下文检查数据 using (var cont
.Find()
查询数据时才会缓存数据
在下面的示例中,我使用.First()
时缓存了查询数据:
为什么account2的余额是50?根据我的考虑,它应该是0
提前感谢使用AsNoTracking()
使用AsNoTracking()
您的
TransactionScope
必须在您的上下文中并开始交易
如果您像以前那样声明它们,那么您的上下文中就没有打开的事务
使用Celso Livero said等信息=>
使用另一个上下文
检查数据
using (var context = new SekhavatDBEntities())
{
var account2 = context.Accounts.First(acc => acc.Id == new Guid("79B7AAC6-AD2D-4824-907E-16ADB4C41EE1"));
}
First()
或Find()
不是您的事务问题。
正如Erk所说,在上下文中已经存在具有相同密钥的实体
数据缓存在您的
上下文中
,不是因为您使用的是First()
或Find()
您的事务范围必须在您的上下文中并开始事务
如果您像以前那样声明它们,那么您的上下文中就没有打开的事务
使用Celso Livero said等信息=>
使用另一个上下文
检查数据
using (var context = new SekhavatDBEntities())
{
var account2 = context.Accounts.First(acc => acc.Id == new Guid("79B7AAC6-AD2D-4824-907E-16ADB4C41EE1"));
}
First()
或Find()
不是您的事务问题。
正如Erk所说,在上下文中已经存在具有相同密钥的实体
数据缓存在您的上下文中
,不是因为您使用的是First()
或Find()
,以下是相关引用:
请注意,DbSet和IDbSet总是针对数据库创建查询
并且始终涉及到数据库的往返,即使
返回的实体在上下文中已存在
当从数据库返回结果时,不存在的对象
在上下文中,将附加到上下文如果对象已在中
返回现有对象的上下文(当前对象和原始对象)
条目中对象属性的值不会被覆盖
使用数据库值)
是否使用事务不相关。相关的是:
EF不会在事务回滚时将值更改回原始值(我认为它甚至不可能这样做,但无论如何)。无论您使用的是TransactionScope
还是ctx.Database.BeginTransaction
在您进行第二次查询时,您的id为79B7AAC6-AD2D-4824-907E-16ADB4C41EE1的帐户已被上下文跟踪。根据上面的文档-将对数据库进行查询,但此查询的结果将被丢弃,并且不会覆盖当前跟踪实体的值。相反,实体将按原样返回(余额等于50)
要防止这种情况,请:
为单独的操作使用单独的上下文,并尽可能避免重用上下文
使用AsNoTracking
。这将阻止上述行为,并将始终返回数据库中的实体
使用重新加载:
context.Entry(account).Reload();
这将查询该实体的数据库,并用当前数据库值覆盖所有值。以下是相关引用:
请注意,DbSet和IDbSet总是针对数据库创建查询
并且始终涉及到数据库的往返,即使
返回的实体在上下文中已存在
当从数据库返回结果时,不存在的对象
在上下文中,将附加到上下文如果对象已在中
返回现有对象的上下文(当前对象和原始对象)
条目中对象属性的值不会被覆盖
使用数据库值)
是否使用事务不相关。相关的是:
EF不会在事务回滚时将值更改回原始值(我认为它甚至不可能这样做,但无论如何)。无论您使用的是TransactionScope
还是ctx.Database.BeginTransaction
在您进行第二次查询时,您的id为79B7AAC6-AD2D-4824-907E-16ADB4C41EE1的帐户已被上下文跟踪。根据上面的文档-将对数据库进行查询,但此查询的结果将被丢弃,并且不会覆盖当前跟踪实体的值。相反,实体将按原样返回(余额等于50)
要防止这种情况,请:
为单独的操作使用单独的上下文,并尽可能避免重用上下文
使用AsNoTracking
。这将阻止上述行为,并将始终返回数据库中的实体
使用重新加载:
context.Entry(account).Reload();
这将查询该实体的数据库,并用当前数据库值覆盖所有值。account.Balance=50代码>context.Entry(account.State=EntityState.Modified代码>context.SaveChanges()代码>您保存了更改,为什么不是50?@juharr,因为我处理了事务并回滚了事务,因此在数据库中余额为0@CelsoL数据库中的ívero记录实际上已回滚,在使用.First()时,上下文不应缓存数据,因此在Next.First()中它应该再次查询数据并获得回滚数据,但它不查询数据并返回缓存数据account@M.Azad您是否可以发布一个指向文档的链接,说明只有在使用Find
时才会缓存数据?因为那根本不是真的。account.Balance=50代码>context.Entry(account.State=EntityState.Modified代码>context.SaveChanges()代码>你保存了更改,为什么不是50?@juharr,因为我处理了事务,事务回滚到da
context.Entry(account).Reload();