【问题标题】:How do I cache look up data in Linq to Sql, and use that data in a separate DataContext?如何缓存 Linq to Sql 中的查找数据,并在单独的 DataContext 中使用该数据?
【发布时间】:2010-05-28 07:52:31
【问题描述】:

我正在进行的项目有很多与之相关的“查找”数据。出于这个原因,在处理这个问题的类的第一个实例化时,我使用所有查找数据设置了静态 IEnumerable,因此:

private static IEnumerable<Kiosk> _kiosks;
private static IEnumerable<Paper> _papers;
private static IEnumerable<NewsAgent> _newsAgents;

还有..

if (_kiosks == null)
   _kiosks = db.Kiosks.Where(k => k.Active).OrderBy(k => k.Order).ToList();

if (_papers == null)
   _papers = db.Papers.Where(p => p.Active).OrderBy(p => p.Name).ToList();

if (_newsAgents == null)
   _newsAgents = db.NewsAgents.Where(n => n.Active).OrderBy(n => n.Order).ToList();

每次实例化此类时,我都会使用全新的 DataContext 为需要保存的数据类创建新的 Linq 实体。当我尝试提交这些更改时,我收到以下错误:

"System.NotSupportedException: An attempt has been made to Attach or Add an entity that is not new, perhaps having been loaded from another DataContext. This is not supported."

我认为缓存的查找数据是在单独的 DataContext 上创建的,导致了这个问题。我认为这无关紧要,因为缓存的数据是使用 ToList 持久化的,尽管猜测每个实体内部都会保存它生成的 DataContext。

拥有静态 DataContext 是不可能的,因为上一次运行中对数据实体的更改可能不会提交。在第二次运行时对 datacontext 调用 Submit 会导致原始实体未持久化的错误。

那么,我怎样才能将这些缓存数据持久化以在新的 DataContext 上使用?

我的假设是缓存的查找数据来自一个单独的

【问题讨论】:

    标签: c# .net linq-to-sql caching


    【解决方案1】:

    首先不要缓存从数据上下文返回的实际对象。缓存简单的 poco 对象,而不是仅包含最少的信息,然后在更新时使用 ID 值而不是对象:

    Employee.Status = cachedStatus;
    

    变成

    Employee.StatusID = cachedStatus.ID;
    

    【讨论】:

      猜你喜欢
      • 2011-01-31
      • 2012-12-25
      • 2011-01-07
      • 1970-01-01
      • 1970-01-01
      • 2011-01-09
      • 1970-01-01
      • 2010-10-31
      • 1970-01-01
      相关资源
      最近更新 更多