国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Ef Core花里胡哨系列(10) 動(dòng)態(tài)起來的 DbContext

這篇具有很好參考價(jià)值的文章主要介紹了Ef Core花里胡哨系列(10) 動(dòng)態(tài)起來的 DbContext。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

Ef Core花里胡哨系列(10) 動(dòng)態(tài)起來的 DbContext

我們知道,DbContext有兩種托管方式,一種是AddDbContextAddDbContextFactory,但是呢他們各有優(yōu)劣,例如工廠模式下性能更好呀等等。那么,我們能否自己托管DbContext呢?

Github Demo:動(dòng)態(tài)起來的 DbContext

場景:
結(jié)合我們之前的文章 [Ef Core花里胡哨系列(5) 動(dòng)態(tài)修改追蹤的實(shí)體、動(dòng)態(tài)查詢] 假設(shè)一個(gè)應(yīng)用內(nèi)有很多的子應(yīng)用,且都需要更新追蹤的動(dòng)態(tài)實(shí)體,那么很多表在重置OnModelCreating的時(shí)候?qū)?huì)非常的慢。主要體現(xiàn)在modelBuilder.Model.AddEntityType(type),每個(gè)實(shí)體都需要花費(fèi)一小段時(shí)間,幾百個(gè)實(shí)體就會(huì)按分鐘計(jì)算了,而且還會(huì)數(shù)據(jù)庫操作產(chǎn)生一定的影響。

我們先實(shí)現(xiàn)一個(gè)基礎(chǔ)的DbContext用來添加一些通用的實(shí)體以及處理動(dòng)態(tài)實(shí)體的邏輯,每次需要重置DbContext的時(shí)候,都會(huì)獲取最新的動(dòng)態(tài)實(shí)體進(jìn)行更新:

public class DbContextBase : DbContext
{
    public DbSet<User> Users { get; set; } = null!;
    public DbSet<Department> Departments { get; set; } = null!;

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlite("Data Source=sample.db");
        optionsBuilder.ReplaceService<IModelCacheKeyFactory, MyModelCacheFactory>();

        base.OnConfiguring(optionsBuilder);
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        var name = GetType().Name.Split("_");
        if (name.Length > 1)
        {
            foreach (var item in FormTypeBuilder.GetAppTypes(name[0]).Where(item => modelBuilder.Model.FindEntityType(item.Value) is null))
            {
                modelBuilder.Model.AddEntityType(item.Value);
            }
        }

        base.OnModelCreating(modelBuilder);
    }
}

然后實(shí)現(xiàn)一個(gè)動(dòng)態(tài)DbContext的生成器,用于針對(duì)不同的AppId生成不同的DbContext

public class DbContextGenerator
{
    private readonly ConcurrentDictionary<string, Type> _contextTypes = new()
    {
    };

    public Type GetOrCreate(string appId)
    {
        if (!_contextTypes.TryGetValue(appId, out var value))
        {
            value = GeneratorDbContext(appId);
            _contextTypes.TryAdd(appId, value);
        }

        return value;
    }

    public Type GeneratorDbContext(string appId)
    {
        var assemblyName = new AssemblyName("__RuntimeDynamicDbContexts");
        var assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
        var moduleBuilder = assemblyBuilder.DefineDynamicModule("__RuntimeDynamicModule");
        var typeBuilder = moduleBuilder.DefineType($"{appId.ToLower()}_DbContext", TypeAttributes.Public | TypeAttributes.Class, typeof(DbContextBase));
        var constructorBuilder = typeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, new Type[] { });
        var ilGenerator = constructorBuilder.GetILGenerator();
        ilGenerator.Emit(OpCodes.Ldarg_0);
        ilGenerator.Emit(OpCodes.Call, typeof(DbContextBase).GetConstructor(Type.EmptyTypes));
        ilGenerator.Emit(OpCodes.Ret);
        typeBuilder.CreateType();
        var dbContextType = assemblyBuilder.GetType($"{appId.ToLower()}_DbContext");
        return dbContextType;
    }
}

然后我們需要實(shí)現(xiàn)一個(gè)DbContext的容器用于管理我們生成的DbContext,以及負(fù)責(zé)初始化:

public class DbContextContainer : IDisposable
{
    private readonly DbContextGenerator _generator;
    private readonly Dictionary<string, DbContext> _contexts = new();

    public DbContextContainer(DbContextGenerator generator)
    {
        _generator = generator;
    }

    public DbContext Get(string appId)
    {
        if (!_contexts.TryGetValue(appId, out var context))
        {
            context = (DbContext)Activator.CreateInstance(_generator.GetOrCreate(appId))!;
            _contexts[appId] = context;
        }

        return context;
    }

    public void Dispose()
    {
        _contexts.Clear();
    }
}

DbContextContainer的生命周期即DbContext的生命周期,因?yàn)?code>DbContext的緩存是共享的,所以我們也不用擔(dān)心一些性能問題。

使用時(shí)也非常簡單,我們只需要在DbContextContainer取出我們對(duì)應(yīng)AppIdDbContext進(jìn)行操作就可以了:文章來源地址http://www.zghlxwxcb.cn/news/detail-776481.html

public class DynamicController : ApiControllerBase
{
    private readonly DbContextContainer _container;

    public DynamicController(DbContextContainer container)
    {
        _container = container;
    }

    [HttpGet]
    public async Task<IActionResult> GetCompanies()
    {
        var res = await _container.Get("test1").DynamicSet(typeof(Company)).ToDynamicListAsync();

        return Ok(res);
    }

    [HttpGet]
    public async Task<IActionResult> AddCompany()
    {
        var db = _container.Get("test1");
        FormTypeBuilder.AddDynamicEntity("test1", "Companies", typeof(Company));
        db.UpdateVersion();

        return Ok();
    }
}

到了這里,關(guān)于Ef Core花里胡哨系列(10) 動(dòng)態(tài)起來的 DbContext的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 深入理解 python 虛擬機(jī):花里胡哨的魔術(shù)方法

    在本篇文章當(dāng)中主要給大家介紹在 cpython 當(dāng)中一些比較花里胡哨的魔術(shù)方法,以幫助我們自己實(shí)現(xiàn)比較花哨的功能,當(dāng)然這其中也包含一些也非常實(shí)用的魔術(shù)方法。 在 Python 中, __hash__() 方法是一種特殊方法(也稱為魔術(shù)方法或雙下劃線方法),用于返回對(duì)象的哈希值。哈希

    2024年02月06日
    瀏覽(19)
  • 一款適合程序員的 Markdown 簡歷模版,拒絕花里胡哨

    一款適合程序員的 Markdown 簡歷模版,拒絕花里胡哨

    一款適合 IT 行業(yè)的 Markdown 簡約簡歷模版,拒絕花里胡哨 (1)安裝 Markdown 編輯軟件,推薦使用?Typora?編輯器(免費(fèi)版 Typora 百度網(wǎng)盤下載點(diǎn)此下載)。 (2)下載本項(xiàng)目,修改?Resume.md?文件即可。 (3)將 style 文件夾下的所有的.css 復(fù)制到 Typora 的主題文件夾 (4)主題文件

    2024年02月06日
    瀏覽(22)
  • 如何在C語言中將文字顯示為花里胡哨的多種顏色

    如何在C語言中將文字顯示為花里胡哨的多種顏色

    ????????Hello大家好!最近剛剛做完C語言的課程設(shè)計(jì)。在評(píng)分標(biāo)準(zhǔn)中有一項(xiàng)是展示界面美觀整潔。學(xué)前端的我對(duì)花里胡哨的界面情有獨(dú)鐘,這里為大家簡單介紹三種改變字體顏色的方法。 ????????注意:本文中所有演示截圖均來自VS 2022。 目錄 ?改變C語言顯示界面字體

    2024年02月03日
    瀏覽(20)
  • MATLAB | 這些各種各樣的花里胡哨的折線填充圖咋畫

    MATLAB | 這些各種各樣的花里胡哨的折線填充圖咋畫

    這些各種各樣的花里胡哨的折線填充圖咋畫? 折線下面填充純色的話area函數(shù)很容易做到,但上面那些各種花里胡哨的填充圖就沒那么容易做到了,本期就來講講這些玩意都是咋畫的: 事先說明,為了繪圖好看本文絕大多數(shù)圖像都使用如下函數(shù)進(jìn)行修飾: 二維填充所用到的數(shù)

    2023年04月16日
    瀏覽(27)
  • 【一步教學(xué),一步到位】花里胡哨的3D翻頁卡片,隔壁產(chǎn)品都饞哭

    【一步教學(xué),一步到位】花里胡哨的3D翻頁卡片,隔壁產(chǎn)品都饞哭

    with(cardShadowSizeFunc!!) { inParamMin = 0F inParamMax = 180F outParamMax = 50F outParamMin = 0F initValue = 10F } cardShadowDistanceFunc = CardShadowDistanceFunc() with(cardShadowDistanceFunc!!) { inParamMin = 0F inParamMax = 180F outParamMax = 50F outParamMin = 0F initValue = 10F } } 復(fù)制代碼 2.5.3 陰影變化 為了更好地模擬3D效果,卡片陰影

    2024年04月14日
    瀏覽(25)
  • EF Core并發(fā)控制

    EF Core并發(fā)控制

    并發(fā)控制:避免多個(gè)用戶同時(shí)操作資源造成的并發(fā)沖突問題。 最好的解決方案:非數(shù)據(jù)庫解決方案 數(shù)據(jù)庫層面的兩種策略:悲觀、樂觀 悲觀并發(fā)控制一般采用行鎖 ,表鎖等排他鎖對(duì)資源進(jìn)行鎖定,確保同時(shí)只有一個(gè)使用者操作被鎖定的資源。 EF Core沒有封裝悲觀并發(fā)控制的

    2024年02月10日
    瀏覽(20)
  • 4.1EF Core

    EF Core是微軟官方的ORM框架,ORM即對(duì)象關(guān)系映射,也就是我們可以直接操作C#中的對(duì)象就可以完成數(shù)據(jù)庫的操作。 EF Core環(huán)境搭建 首先要?jiǎng)?chuàng)建C#對(duì)象,用以對(duì)應(yīng)數(shù)據(jù)庫中的表,該C#對(duì)象也成為實(shí)體類。 根據(jù)所用的數(shù)據(jù)庫選擇NuGet包,本文使用SQLite數(shù)據(jù)庫,所以安裝Microsoft.EntityF

    2024年02月05日
    瀏覽(18)
  • EF Core入門

    EF Core入門

    EF Core是微軟官方提供的ORM框架。EF Core不僅可以操作Microsoft SQL Server、MySQL、Oracle、PostgreSQL等數(shù)據(jù)庫,而且可以操作Azure Cosmos DB等NoSQL數(shù)據(jù)庫 前提條件:已經(jīng)完整安裝了Microsoft SQL Server 下面是一個(gè)實(shí)際操作EF Core的演示 這是項(xiàng)目最終的目錄,這里需要關(guān)注的就是 .cs 文件 首先新

    2023年04月09日
    瀏覽(18)
  • 【EF Core】實(shí)體的主、從關(guān)系

    【EF Core】實(shí)體的主、從關(guān)系

    假設(shè)有以下兩個(gè)實(shí)體: Homework 類表示家庭作業(yè),它并不是獨(dú)立使用的,而是與學(xué)生類(Student)有依賴關(guān)系。一位學(xué)生有多個(gè)家庭作業(yè)記錄,即 Homework 對(duì)象用于記錄每位同學(xué)的作業(yè)的。按照這樣的前提,Student 是主對(duì)象,Homework 是從對(duì)象。 Student 對(duì)象有個(gè) Homeworks 屬性,用于引

    2024年02月11日
    瀏覽(24)
  • Net Core中使用EF Core連接Mysql數(shù)據(jù)庫

    Net Core中使用EF Core連接Mysql數(shù)據(jù)庫

    Entity Framework Core的前身是微軟提供并主推的ORM框架,簡稱EF,其底層是對(duì)ADO.NET的封裝。EF支持SQLServer、MYSQL、Oracle、Sqlite等所有主流數(shù)據(jù)庫。 首先是使用時(shí)的幾個(gè)模式的整理及其理解: Code First:根據(jù)代碼自動(dòng)創(chuàng)建數(shù)據(jù)庫表結(jié)構(gòu)甚至是數(shù)據(jù)庫,可以支持多庫開發(fā),代碼較少冗余

    2024年01月24日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包