Как мне кэшировать поиск данных в Linq to Sql и использовать эти данные в отдельном DataContext? - PullRequest
1 голос
/ 28 мая 2010

В проекте, над которым я работаю, довольно много данных о поиске, связанных с ним. По этой причине при первом создании экземпляра класса, который это обрабатывает, я установил статические 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();

Каждый раз, когда создается экземпляр этого класса, я создаю новые сущности Linq для классов данных, которые мне нужно сохранить, используя совершенно новый DataContext. Когда я пытаюсь отправить эти изменения, я получаю следующую ошибку:

"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 исключено, так как изменения в объектах данных в предыдущем запуске могут быть не отправлены. Вызов Submit во втором запуске datacontext вызывает ошибку, когда исходные объекты не сохраняются.

Как тогда я могу сохранить эти кэшированные данные для использования в новом DataContext?

Я предполагаю, что кэшированные данные поиска были получены из отдельного

1 Ответ

1 голос
/ 28 мая 2010

Не кэшируйте фактические объекты, возвращаемые из контекста данных. Вместо этого кэшируйте простые объекты poco, которые имеют минимальную информацию о них, а затем используйте значения ID вместо объектов при обновлении:

Employee.Status = cachedStatus;

становится

Employee.StatusID = cachedStatus.ID;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...