如何阻止企业库缓存块持久更改我从中检索到的数据?

时间:2010-09-10 14:06:15

标签: wpf caching enterprise-library

你在想什么是一个笨拙措辞的问题?

当我的应用程序加载时,它会进入数据库并获取几个不同的数据查找表,并为每个查找表创建.NET列表并将它们放入缓存中。例如,“状态”。

此时列出: 上, 关

当我从缓存中检索状态列表时,我将另一个项添加到List,“Choose One”并将其设置为ComboBox的ItemsSource。除了状态列表之外,我在任何时候都不会放入新的List,现在包含“Choose One”。

List<ContractStatus> contractStatuses = (List<ContractStatus>)this._cacheManager["CurrentContractStatuses"];

        ContractStatus contractStatus = new ContractStatus
            {
               ContractStatusDescription = "Choose One", ContractStatusId = 0 
            };
        contractStatuses.Insert(0, contractStatus);

此时列出: 选一个, 上, 关

然而,如果我转到另一个屏幕并返回,屏幕的加载例程会从缓存中提取状态列表,并且选择一个已经在列表中。因此,当例程添加“选择一个”时,我结束了:

选择一个, 选一个, 上, 关

这是设计的吗?我怎么告诉它退出呢?

1 个答案:

答案 0 :(得分:0)

缓存管理器正在向您的List<ContractStatus>返回引用。此引用指向缓存中的对象。然后,您将一个项目插入到缓存中的相同列表中。

是否可以缓存包含“Choose One”的List版本,以便您只从缓存中读取List?如果是这样,那么应该避免你看到的“问题”。

如果您确实需要从缓存中操作List而不修改缓存中的List,那么您应该在操作之前克隆List:

List<ContractStatus> contractStatuses =      
    (List<ContractStatus>)this._cacheManager["CurrentContractStatuses"];

// Clone the list (but not the items)
List<ContractStatus> newStatuses = 
    contractStatuses.ConvertAll<ContractStatuses>(item => item);

ContractStatus contractStatus = new ContractStatus
{
    ContractStatusDescription = "Choose One", ContractStatusId = 0 
};

newStatuses.Insert(0, contractStatus);