EF Core 如何重復執(zhí)行DbContext 的 OnModelCreating

出于性能考慮喻圃,DbContext中的OnModelCreating在缺省狀態(tài)下泊愧,只在第一次實例化DbContext時執(zhí)行,執(zhí)行后的結果被放在緩存中官套,供以后的實例使用酒奶。然而,在有些情況下奶赔,DbContext需要根據(jù)調用的場景發(fā)生變化惋嚎,需要重新執(zhí)行OnModelCreating,這種情況下站刑,需要編寫自定義的緩存服務替換缺省的緩存服務另伍,新的緩存服務根據(jù)DbContext的變化確定緩存的鍵值,如果緩存中沒有相應的對象绞旅,就重新執(zhí)行OnModelCreating摆尝,生成相應的對象,保存在緩存中因悲。

首先堕汞,編寫自定義的ModelCacheKey,這里囤捻,我們需要為DynamicDbContext編寫ModelCacheKey臼朗,根據(jù)DynamicDbContext中的Key值確定ModelCacheKey是否變化:

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;

namespace Plat.EFDynamic
{
    class MyModelCacheKey : ModelCacheKey
    {
        private string key; 
        public MyModelCacheKey(DbContext context) : base(context)
        {
            key = (context as DynamicDbContext).Key;
        }

        protected override bool Equals(ModelCacheKey other)
        => base.Equals(other)
            && (other as MyModelCacheKey)?.key == key;

        public override int GetHashCode()
        {
            var hashCode = base.GetHashCode() * 397;
            if (!string.IsNullOrEmpty(key))
            {
                hashCode ^= key.GetHashCode();
            }

            return hashCode;
        }
    }
}

然后,編寫自定義的IModelCacheKeyFactory蝎土,根據(jù)DbContext創(chuàng)建ModelCacheKey:

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;

namespace Plat.EFDynamic
{
    public class MyModelCacheKeyFactory : IModelCacheKeyFactory
    {
        public object Create(DbContext context)
        => new MyModelCacheKey(context);
    }
}

最后视哑,在定義DbContext時,使用自定義的IModelCacheKeyFactory替換缺省值:

services.AddEntityFrameworkSqlServer().AddDbContext<DynamicDbContext>(option =>
            {
                option.UseSqlServer(connstring)
                .ReplaceService<IModelCacheKeyFactory, MyModelCacheKeyFactory>(); ;
            });
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末誊涯,一起剝皮案震驚了整個濱河市挡毅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌暴构,老刑警劉巖跪呈,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件段磨,死亡現(xiàn)場離奇詭異,居然都是意外死亡耗绿,警方通過查閱死者的電腦和手機苹支,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來误阻,“玉大人债蜜,你說我怎么就攤上這事【糠矗” “怎么了寻定?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長精耐。 經(jīng)常有香客問我狼速,道長,這世上最難降的妖魔是什么卦停? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任向胡,我火速辦了婚禮,結果婚禮上沫浆,老公的妹妹穿的比我還像新娘捷枯。我一直安慰自己,他們只是感情好专执,可當我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布淮捆。 她就那樣靜靜地躺著,像睡著了一般本股。 火紅的嫁衣襯著肌膚如雪攀痊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天拄显,我揣著相機與錄音苟径,去河邊找鬼。 笑死躬审,一個胖子當著我的面吹牛棘街,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播承边,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼遭殉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了博助?” 一聲冷哼從身側響起险污,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蛔糯,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拯腮,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年蚁飒,在試婚紗的時候發(fā)現(xiàn)自己被綠了动壤。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡飒箭,死狀恐怖狼电,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情弦蹂,我是刑警寧澤,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布强窖,位于F島的核電站凸椿,受9級特大地震影響,放射性物質發(fā)生泄漏翅溺。R本人自食惡果不足惜脑漫,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望咙崎。 院中可真熱鬧优幸,春花似錦、人聲如沸褪猛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽伊滋。三九已至碳却,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間笑旺,已是汗流浹背昼浦。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留筒主,地道東北人关噪。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像乌妙,于是被迫代替她去往敵國和親使兔。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,500評論 2 359