首页 > 解决方案 > 缓存一些数据 EF

问题描述

我有一个 DbContext 和许多实体。我想缓存其中的一个实体。即我有一个实体Address

public partial class Address : BaseEntity
{
    public string Street { get; set; }
    public string City { get; set; }
    public string ZipPostalCode { get; set; }
    public int StateProvinceId { get; set; }
    public string ContactName { get; set; }
    public string ContactPhone { get; set; }
    public string ContactFaxNumber { get; set; }
    public string ContactEmail { get; set; }

    public virtual StateProvince StateProvince { get; set; }
}

StateProvince

public partial class StateProvince : BaseEntity
{
    public string Name { get; set; }
    public string Abbreviation { get; set; }
    public int TruckSpeedLimit { get; set; }
}

当我通过 ID 获取地址时,例如:

var address = _db.Addresses.Where(p=>p.Id == id).FirstOrDefault();

然后尝试获取州名:

var state = address.StateProvince.Name;

它向数据库创建了另一个请求。如果我有一个地址列表,它会创建列表元素附加请求的计数

当然,我可以创建 DTO 类并在 Linq 查询中进行投影,例如:

var address = _db.Addresses.Where(p=>p.Id == id).Select(p=> new AddressDTO{ Id = p.Id, ..., StateName = p.StateProvince.Name..}).FirstOrDefault();

但是我的代码架构师根本不喜欢 DTO 类,我也不想为简单实体做重复的类。

状态列表是静态的。我怎么能对 EF 说:“请缓存状态!” 并避免对数据库的额外请求?

标签: c#entity-frameworkcachinglinq-to-entities

解决方案


这最好在 EF 之外完成。只需将静态变量分配给该值

db.States.AsNoTracking().ToList()

EF 中没有任何机制可以强制它从不刷新实体。


推荐阅读