EF ORM技巧:强制从数据库获取数据 (ef 强制从数据库获取)

Entity Framework (EF) 是一个用于 .NET 开发的 ORM 框架,其更大的优势之一是具有极其灵活的查询和数据操作能力。但是,有时候我们需要强制从数据库中获取一个数据而不使用缓存。这在 EF 中应该如何实现呢?

现在,我们假设有一个简单的示例,其中包含两个实体类:Customer 和 Order。Customer 包含一个订单 OrderList:

“`csharp

public class Customer

{

public int Id { get; set; }

public string Name { get; set; }

public ICollection OrderList { get; set; }

}

public class Order

{

public int Id { get; set; }

public DateTime OrderDate { get; set; }

public int CustomerId { get; set; }

public Customer Customer { get; set; }

}

“`

在这个示例中,我们有一个指向 Customer 实体的导航属性,称为 OrderList。

如果我们以以下方式获取 OrderList,即通过 Customer 实例调用这个属性:

“`csharp

var customer = dbContext.Customers.FirstOrDefault(c => c.Id == 1);

var orders = customer.OrderList;

“`

EF 默认会从数据库中加载 Customer,并在之一次访问其 OrderList 属性时对其进行延迟加载。

但是,该缓存可能会导致问题。例如,在一个线程中修改了一个订单,而在另一个线程中却查看了相同客户的订单列表,此时你可能会看到旧数据而不是更新后的内容。为了避免此类问题,可以通过以下方式强制从数据库中获取数据:

“`csharp

var customer = dbContext.Customers

.Include(c => c.OrderList)

.AsNoTracking()

.FirstOrDefault(c => c.Id == 1);

var orders = customer.OrderList.ToList();

“`

此处使用的 AsNoTracking() 方法告诉 EF 不要跟踪这个对象。而 Include() 方法指示 EF 装载 OrderList 属性的数据。通过调用 ToList(),我们可以确保此时 EF 将从数据库中获取 OrderList 而不是从缓存中获取它。

如果想要避免出现 bug,或者出于其他安全或性能考虑,我们强烈建议您在类似上述代码的 EF 查询中使用该方法。


数据运维技术 » EF ORM技巧:强制从数据库获取数据 (ef 强制从数据库获取)