ASP.NET MVC ‹OutputCache› SqlDependency (CommandNotification?) с LINQ заявки

Използвам LINQ заявки в моето ASP.NET MVC приложение и искам да използвам OutputCache в някои от моите действия.

Чувам, че това трябва да е възможно с CommandNotifications. Но те изглежда важат само за самостоятелно създадени SQLCommands, или греша?

Мога ли ръчно да кажа на SQL сървъра да изпраща известия за SQLDependency, ако определени таблици се променят? И ако да, как мога да ги прикача към OutputCache?

Друг страничен въпрос: Можете ли да направите това и със силно типови изгледи?

Благодаря ви предварително...


person sinni800    schedule 04.05.2010    source източник


Отговори (2)


Можете да пробвате проекта LinqToCache. Той прави точно това, което поискате, закача SqlDependency за която и да е LINQ заявка, стига заявката, изпратена до SQL Server, съответства на Ограничения за известия за заявки. За Linq-to-SQL това се състои главно от указване на пълното име от две части за таблици в дизайнера на модел (т.е. dbo.Table не само Table). За Linq-to-EF за съжаление начинът, по който EF избира да форматира заявката, е несъвместим с ограниченията на QN.

person Remus Rusanu    schedule 02.08.2010

Но те изглежда важат само за самостоятелно създадени SQLCommands, или греша?

Бих казал, че са полезни само за „самосъздадени“ команди, защото те са единствените, за които можете да знаете предварително. Ако искате да създадете известие за конкретна LINQ заявка, добре, тогава просто ще извикате метода в код заедно със заявката.

Мога ли ръчно да кажа на SQL сървъра да изпраща известия за SQLDependency, ако определени таблици се променят?

Сигурен. Изпратете известие на:

SELECT * FROM TABLENAME;

И ако да, как мога да ги прикача към OutputCache?

Направете команда, създайте зависимост от кеша и я препратете, когато добавяте към кеша. Инициализирайте известията за зависимости в global.asax.cs както обикновено.

Можете ли да направите това и със строго типови изгледи?

Няма да има смисъл. В MVC не трябва да правите достъп до данни в изгледа.

person Craig Stuntz    schedule 04.05.2010
comment
› Просто бихте извикали метода в код заедно със заявката ... Кой метод? SqlDependency.Start(connectionString) може би? › Направете команда New SqlCommand с SELECT * от TABLENAME? › създайте зависимост от кеша и я препратете, когато добавяте към кеша... Не разбрах това.. съжалявам... › Инициализирайте известията за зависимости в global.asax.cs както обикновено. Прочетох това някъде... Взех примерен код от там... С персонализирано събитие OnChange. Какво обаче прави това? И как помага с атрибута OutputCache? Напълно съм объркан от тази тема... - person sinni800; 04.05.2010
comment
Първата ми точка: Не се нуждаете от известия за персонализирани заявки. Можете просто да извикате каквото искате да направите точно там, вместо да чакате известие. Известията са, когато искате да знаете кога някой друг е променил данните. Да, Start. Що се отнася до това как да добавите зависимост от кеша, коя част от документите на MSDN за това не ви е ясна? - person Craig Stuntz; 04.05.2010
comment
Имам чувството, че има толкова много начини да направя това и не знам кой е правилният за мен. Не ми трябват известия за персонализирани заявки? Какво тогава? Имам уебсайт със съдържание, което може често да се променя от всеки. Нещо като форум. Така че мисля, че някой друг се прилага тук. Също така не знам къде да търся в MSDN документите. - person sinni800; 04.05.2010
comment
Ако единственото приложение, което някога ще промени базата данни, е вашето приложение, тогава не се нуждаете от известия за заявки. Имате нужда от (1) CQRS като цялостен модел на приложение и (2) модела на хранилището за известия, когато наистина имате нужда от тях. Анулирането на кеша е трудно; няма един клас, който да реши тези проблеми вместо вас. Що се отнася до действителното използване на SqlCacheDependency, има пример в страницата с общ преглед на SqlCacheDependency msdn.microsoft.com/en-us/library/. Просто се преструвайте, че е някъде другаде, а не Page_Load. - person Craig Stuntz; 04.05.2010
comment
Благодарение на вас се доближавам до истинското разбиране на случващото се. Така че имам нужда от команда за SQLDependency... Мога да заменя тези критични LINQ команди с истински SQL команди и да направя SQLDependencies за тях. Прав ли съм с това? Или мога да използвам LinqDataContext.GetCommand, за да получа TSQL командата, която съответства на LINQ, който изпълних... Когато създам тези SQLDependency Objects с командите и използвам SQLDependency.Start, ще задейства ли CommandNotification като в ‹OutputCache SqlDependency:=CommandNotification )› (моят атрибут на действие, пропуснати параметри) тогава? - person sinni800; 04.05.2010
comment
Не, не би било правилно да замените LINQ със SQL. Моля, приемете това по правилния начин: наистина трябва да отделите известно време, за да научите как работят известията за заявки в SQL Server, преди да опитате да ги внедрите в приложението си. Тук дяволът е в детайлите. Никой не може да обясни това в един отговор на Stack Overflow. Това е сложна тема и не е магически куршум за отстраняване на проблеми с производителността. - person Craig Stuntz; 04.05.2010
comment
Досега знам, че има Service Brokers, които се обаждат обратно към приложението ASP.NET. Приложението ASP.NET изглежда поставя тези обратни извиквания в бисквитка, която можете да извлечете чрез отдалечено управление. Мислех, че това е приложимо толкова лесно, колкото е без използване на LINQ. - person sinni800; 05.05.2010
comment
Ако вярвате, че зависимостите от SQL кеша са винаги лесни, тогава не сте разбрали напълно проблема. Правилната политика за кеша винаги е трудна. SQL зависимостите добавят слой сложност отгоре на това. Не позволявайте на факта, че е лесно да поставите директива на ASPX страница, да ви заблуди да мислите, че кеширането е лесно! - person Craig Stuntz; 05.05.2010
comment
Оф. Приложението ми дори няма да е толкова голямо... Но ще се опитам просто да го прочета... Мислех, че Framework автоматично открива къде правите SQL и в зависимост от това настройва механизми с SQL Server. В моя случай щеше да има само ЕДНА заявка (Изберете * от таблица), която щеше да е необходима за кеширане, така че реших, че ще бъде лесно за изпълнение. Просто анулирайте HTML кеша, когато SQL Server се окаже обратен ефект, че таблицата се е променила. Нищо друго. - person sinni800; 08.05.2010
comment
Това, което питате, не е толкова просто, колкото си мислите. Пазете се от преждевременна оптимизация. Създайте приложението си, накарайте го да работи и след това помислете за кеширане, когато сте го профилирали и сте намерили най-бавните части. - person Craig Stuntz; 10.05.2010