Позволяет ли Entity Framework автоматически кэшировать модель ModelBuilder?

Я разрабатываю приложение ASP MVC с использованием Entity Framework. Я думал о написании кода для кэширования объекта, возвращенного ModelBuilder (как рекомендуется несколькими источниками), но потом я наткнулся на это в блоге Скотта Гу:

«Метод OnModelCreating выше будет вызван в первый раз, когда наш класс NerdDinners используется в работающем приложении, и ему передается объект «ModelBuilder» в качестве аргумента. Объект ModelBuilder может использоваться для настройки правил отображения постоянства базы данных наших объектов модели. Мы рассмотрим несколько примеров того, как это сделать. ниже.

«EF вызывает метод« OnModelCreating »только один раз в работающем приложении - , а затем автоматически кэширует результаты ModelBuilder . Это позволяет избежать снижения производительности при создании модели каждый раз, когда создается экземпляр класса NerdDinners. класс) в C ++? Я мог бы знать точный метод (ы), который я хочу вызвать для элементов еще не известного подтипа, поэтому неизменно выполняю дополнительный вызов виртуального метода, например V :: visit (A *) в A :: accept (V & v) {v.visit (this); } нежелательно.

// Is the Visitor pattern recommended here?  (E inherits D inherits B.)
class Foo {
public:
  virtual void visit(B *) { result = 3; }
  virtual void visit(D *) { result = 4; }
  virtual void visit(E *) { result = 5; }
private:
  int result;
}; // class Foo

// Need to add generic interface to B and its children ...
class B {
public:
  virtual void accept(class Foo &f) { f.visit(this); }
}; // class B

Я хотел бы что-то функционально эквивалентное следующему, но с O (1) стоимостью, что AFAIK невозможно с лестницами dynamic_cast <> или typeid (), поскольку std :: type_info не может быть constexpr / switchable.

// O(n) search cost might get nasty with bigger hierarchies.
int foo(B *b) {
  if (typeid(b) == typeid(B *)) { return 1; }
  if (typeid(b) == typeid(D *)) { return 2; }
  if (typeid(b) == typeid(E *)) { return 3; }
  return -1;
}

Какие у меня варианты здесь? Спасибо за совет!

Редактировать: Изменен пример кода для подачи результатов через поле, так что несколько подписей не нужны для разных типов методов. Спасибо, Морис!

Окончательное решение: В дополнение к тому, что вам не нравятся обязательные двойные затраты на отправку по шаблону посетителя, Я также хотел избежать перегрузки интерфейса foo () , но я не думаю, что для этого существует известный чистый шаблон. Я просто делал прямые статические перегрузки и назвал это днем. В любом случае, мое желание инкапсулировать перегрузку внутри функции, вероятно, в лучшем случае сомнительная цель. Спасибо, Морис за ответ.

8
задан Jeff 7 September 2010 в 21:23
поделиться