meh*_*dvd 5 .net c# entity-framework-core
使用 EntityFramework Core 我有以下代码:
var theStudent = new Student();
theStudent.Title = "Mehran"
theStudent.Status = 1
mainDbContext.Set<Student>().Add(theStudent);
await mainDbContext.SaveChangesAsync();
// In reality data is changed by another program. To simulate it here I alter the data by another dbcontext and raw SQL
using (var utilDbContext = new MelkRadarDbContext())
{
    var command = " update dbo.Student set status=2 where Id=@p0";
    utilDbContext.Database.ExecuteSqlCommand(command, theStudent.Id);
}
var reloadedStudent = await mainDbContext.Set<Student>()
    .Where(s => s.Id == theStudent.Id)
    .FirstOrDefaultAsync();
 Assert.AreNotEqual(reloadedStudent, student);
 Assert.AreEqual(reloadedStudent.Status, 2);
两种断言均失败。似乎在第二次调用时,mainDbContext仍然将旧theStudent对象返回为reloadedStudent,并且不从数据库加载它以获取新数据。为什么会这样?我应该怎么做才能获取数据库中的最新数据?
您有两个选择:
[不推荐]对每个实体使用Reloador方法:ReloadAsync
await mainDbContext.Entry(theStudent).ReloadAsync();
由于必须为每个实体单独调用此方法,因此当您需要重新加载一堆实体时,效率非常低。
[推荐] 创建一个新的DbContext. 这是解决陈旧数据问题的最终方法。
DbContexts 的设计寿命很短。它们实现了工作单元模式,因此建议DbContext为每批相关操作(业务事务)创建一个 - 例如用户操作(按“保存”按钮)。虽然每个 HTTP 请求(在 Web 应用程序或 Web 服务的上下文中)都有一个的常见做法DbContext可以满足这一点,但有时您需要在一个请求中执行多个“批量操作”。这就是你需要考虑创建更多 s 的时候了DbContext。
DbContext为一系列操作保持单一的要点是缓存、跟踪和延迟加载。每当您需要重新加载数据时,很明显您不再需要从该位置开始的这些功能。因此使用新的DbContext.
一个需要回答的好问题是,为什么首先需要新鲜数据?如果您需要根据数据做出关键决策,并且依赖过时的数据会导致数据存储不一致,那么即使刷新实体也无济于事。在这种情况下,您需要使用更强大的机制,例如锁(数据库或其他)来防止过时的数据。
注意:在Entity Framework 6中,有一个Refresh方法可用于一次刷新所有对象。此方法在Entity Framework Core中不可用,因为事实证明它没有那么有用。
| 归档时间: | 
 | 
| 查看次数: | 1628 次 | 
| 最近记录: |