我在Customer类上添加了一个名为Orders的惰性属性。您认为将数据缓存在私有字段中是明智的吗?
private IList<Order> _orders;
[SubSonicIgnore]
public IList<Order> Orders
{
get
{
if (_orders == null)
{
var repository = new SimpleRepository("MyConnectionString", SimpleRepositoryOptions.None);
_orders = repository.Find<Order>(x => x.CustomerId == this.CustomerId);
}
return _orders;
}
}
或者最好不要像这样缓存它:
[SubSonicIgnore]
public IList<Order> Orders
{
get
{
var repository = new SimpleRepository("MyConnectionString", SimpleRepositoryOptions.None);
return repository.Find<Order>(x => x.CustomerId == this.CustomerId);
}
}
我问的原因是因为我认为为了性能而缓存数据是一个好主意,但与此同时我担心缓存数据会导致数据不同步其他进程插入/删除数据库中的记录。
答案 0 :(得分:0)
在您的情况下,您的缓存订单将在您的Customers对象的生命周期内存在。如果您需要清除缓存的订单,您可以简单地为您的客户重新查询
如果我是你,我会添加一个额外的属性,其名称指定有缓存,添加自定义cacheScope对象(如transactionScope,只有范围存在时缓存才存在),或在文档中指定属性将执行缓存子对象以及持续多长时间
我不会删除缓存。我会将其作为附加属性留在那里。如果你需要,你会得到它
感谢您展示您的缓存逻辑。这是我的。在我的情况下,我的父对象的预期寿命很短,我不希望&gt;总父/子数据的100条记录,我确实会使用所有的子数据。如果我的数据发生了变化,那么我需要重新设置我在这个特定实例中使用的缓存逻辑:
private static List<HostHeader> _cachedHostHeaders;
public List<HostHeader> CachedHostHeaders
{
get
{
if (_cachedHostHeaders == null)
_cachedHostHeaders = this.HostHeaders.ToList();
return _cachedHostHeaders.Where(i => i.SiteID == this.ID).ToList();
}
}