Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.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# 缓存一些数据_C#_Entity Framework_Caching_Linq To Entities - Fatal编程技术网

C# 缓存一些数据

C# 缓存一些数据,c#,entity-framework,caching,linq-to-entities,C#,Entity Framework,Caching,Linq To Entities,我有一个DbContext和许多实体。我想缓存其中的一个实体。即,我有一个实体地址: 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

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

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; }
}
和州省:

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说:“请缓存状态!”并避免向db发出额外的请求?

在正常情况下,您将创建自己的缓存机制

您可以从使用一些典型的缓存例程定义缓存接口开始:

//note: using interface so implementation can be changed later
public interface ICache
{
     //store by key, use resolver if not present.
     T GetOrAdd(string key, Func<T> resolver);
     //invalidate all
     void Invalidate();
     //invalidate by key
     void Invalidate(string key);
}

但我必须说在分离数据/域层时,创建DTO可能很好。此外;您可以问问自己,没有州的地址是什么意思,或者州ID在企业上下文中意味着什么。只是说,;这里有大量的解决方案都是有效的

这最好在EF之外完成。只需将一个静态变量赋值

db.States.AsNoTracking().ToList()

EF中没有强制其从不刷新实体的机制。

如果您可以在不拉动任何关系的情况下生存,那么这实际上会强制EF首先查看其已加载的任何实体,而不是直接访问相关项目的数据库,如果在本地找不到实体,则它将转到服务器。环境足迹6+

context.Set<T>().Find(params object[] keyvalues);
context.Set().Find(params object[]keyvalues);

我喜欢分离域和数据层的方法。但是我的项目架构师说,很难支持,我不想让您陷入尴尬的境地,但通常情况下情况正好相反,尽管这取决于用例;-)下面是一个关于为什么要使用类似DTO的对象的例子:(免责声明,我自己回答)我同意,分离模型(视图/域/数据)是构建应用程序的正确方法,但是,仅使用DTO并不是缓存/db调用问题的答案。所以也许你能找到一种不用DTO的方法。静态的@DavidBrowne解决方案是干净(足够)的、快速且易于实现的但是我根本没有
db.States.AsNoTracking().ToList()
查询!我从
地址.StateProvince.Name
获取州信息!他的意思是:
your\u static\u list=\u db.stateProvisions..AsNoTracking().ToList()
,在DbContext中的某个地方可以查询状态。我该如何处理这个静态变量?它是如何与调用address.StateProvince.Name链接的?您可以将状态作为未更改的实体附加到DbContext中,更改跟踪器应该“修复”地址实体的导航属性。看见
context.Set<T>().Find(params object[] keyvalues);