Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Entity Framework.First()缓存查询数据_C#_.net_Entity Framework 6 - Fatal编程技术网

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();