C# 如何(干净地)实现EF实体类型的缓存?
我一次又一次地遇到这个问题:编写代码来创建实体实例(即将行填充到数据库中),其中有需要填充的子关联(即FK引用) 例如: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
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中处理其生存期是正确的方法
如果您可以使用更复杂的场景,但在这种解决方案中,您的查询仍然必须进行解析,必须计算哈希,因此,对于您的场景,将所有单元预加载到字典看起来是更好的方式。您关于不确定这一点的评论-您的意思是您无法想象它在任何情况下都会存在,我应该首先问自己我做错了什么?