Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.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# 如何(干净地)实现EF实体类型的缓存?_C#_Entity Framework - Fatal编程技术网

C# 如何(干净地)实现EF实体类型的缓存?

C# 如何(干净地)实现EF实体类型的缓存?,c#,entity-framework,C#,Entity Framework,我一次又一次地遇到这个问题:编写代码来创建实体实例(即将行填充到数据库中),其中有需要填充的子关联(即FK引用) 例如: namespace EomApp1.Formss.AB2.Model { public class UnitConversionSource : EomApp1.Formss.AB2.Model.IUnitConversionSource { IEnumerable<UnitConversion> IUnitConversionSo

我一次又一次地遇到这个问题:编写代码来创建实体实例(即将行填充到数据库中),其中有需要填充的子关联(即FK引用)

例如:

namespace EomApp1.Formss.AB2.Model
{
    public class UnitConversionSource : EomApp1.Formss.AB2.Model.IUnitConversionSource
    {
        IEnumerable<UnitConversion> IUnitConversionSource.UnitConversions(DirectAgentsEntities model)
        {
            yield return new UnitConversion
            {
                Coefficient = 1,
                FromUnit = model.Units.First(c => c.Name == "USD"),
                ToUnit = model.Units.First(c => c.Name == "USD"),
                DateSpan = new DateSpan
                {
                    FromDate = DateTime.Now,
                    ToDate = DateTime.Now.Add(TimeSpan.FromHours(1))
                }
            };
        }
    }
}
namespace EomApp1.Formss.AB2.Model
{
公共类UnitConversionSource:EomApp1.Formss.AB2.Model.IUnitConversionSource
{
IEnumerable IUnitConversionSource.UnitConversions(DirectAgentEntities模型)
{
新单位转换收益率
{
系数=1,
FromUnit=model.Units.First(c=>c.Name==“USD”),
ToUnit=model.Units.First(c=>c.Name==“USD”),
DateSpan=新日期span
{
FromDate=DateTime。现在,
ToDate=DateTime.Now.Add(TimeSpan.FromHours(1))
}
};
}
}
}
所需:在给定的有效期(比如10秒)内的第一次执行
model.Units。首先(c=>c.Name==“USD”)
执行,实体从数据库中获取,但随后(在有效期内)从内存缓存中获取

目标:防止插入一百万行的循环进行一百万次相同的select查询

我特别感兴趣的是一个非侵入性的解决方案,它不会影响我在示例中编写代码的方式。这(希望)符合从架构角度分离关注点的最佳实践精神


(注:我不确定我使用的术语“非侵入性”是否是标准的语义-请告诉我是否有更好的方法来实现这一点)

我不确定您的代码有什么意义,但它有明显且正确的解决方案:

    IEnumerable<UnitConversion> IUnitConversionSource.UnitConversions(DirectAgentsEntities model)
    {
        string unit = model.Units.First(c => c.Name == "USD");

        yield return new UnitConversion
        {
            Coefficient = 1,
            FromUnit = unit,
            ToUnit = unit,
            DateSpan = new DateSpan
            {
                FromDate = DateTime.Now,
                ToDate = DateTime.Now.Add(TimeSpan.FromHours(1))
            }
        };
    }
IEnumerable IUnitConversionSource.UnitConversions(DirectAgentEntities模型)
{
字符串单位=model.Units.First(c=>c.Name==“USD”);
新单位转换收益率
{
系数=1,
FromUnit=单位,
ToUnit=单位,
DateSpan=新日期span
{
FromDate=DateTime。现在,
ToDate=DateTime.Now.Add(TimeSpan.FromHours(1))
}
};
}
如果您知道必须经常使用某些值,那么将它们提取到某个字典并自己或在某个缓存API中处理其生存期是正确的方法


如果您可以使用更复杂的场景,但在这种解决方案中,您的查询仍然必须进行解析,必须计算哈希,因此,对于您的场景,将所有单元预加载到字典看起来是更好的方式。

您关于不确定这一点的评论-您的意思是您无法想象它在任何情况下都会存在,我应该首先问自己我做错了什么?