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

EF Core預(yù)編譯模型Compiled Model

這篇具有很好參考價(jià)值的文章主要介紹了EF Core預(yù)編譯模型Compiled Model。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

前言

最近還在和 npgsqlEF Core 斗爭(zhēng),由于 EF Core 暫時(shí)還不支持 AOT,因此在 AOT 應(yīng)用程序中使用 EF Core 時(shí),會(huì)提示問(wèn)題:

EF Core預(yù)編譯模型Compiled Model

聽(tīng)這個(gè)意思,似乎使用 Compiled Model 可以解決問(wèn)題,于是就又研究了一下 EF Core 的這個(gè)功能。

在 EF Core 中,模型根據(jù)實(shí)體類和配置構(gòu)建,默認(rèn)情況下,每次創(chuàng)建一個(gè)新的 DbContext 實(shí)例時(shí),EF Core 都會(huì)構(gòu)建模型。對(duì)于需要頻繁創(chuàng)建 DbContext 實(shí)例的應(yīng)用程序,這可能會(huì)導(dǎo)致性能問(wèn)題。

Entity Framework Core(EF Core)的預(yù)編譯模型(Compiled Model)對(duì)應(yīng)提供了一種優(yōu)化,在 EF Core 6 preview 5 中首次增加了這個(gè)功能,可以讓設(shè)計(jì)人員預(yù)編譯模型,避免在后續(xù)執(zhí)行查詢時(shí)動(dòng)態(tài)生成模型。

預(yù)編譯模型的優(yōu)勢(shì)

  1. 性能提升:通過(guò)預(yù)編譯模型,可以減少應(yīng)用程序啟動(dòng)時(shí)的開(kāi)銷,特別是對(duì)于大型模型。

此處的啟動(dòng)時(shí)間,指 DbContext 的首次啟動(dòng)時(shí)間,由于延遲查詢的機(jī)制,一般 DbContext 并不會(huì)在新建對(duì)象時(shí)完成啟動(dòng),而是在首次執(zhí)行插入或者查詢時(shí)完成這個(gè)過(guò)程。

參考下圖(來(lái)自參考 1):
EF Core預(yù)編譯模型Compiled Model

顯然,隨著模型的規(guī)模增大,啟動(dòng)時(shí)間線性增長(zhǎng);但是使用預(yù)編譯模型后,啟動(dòng)時(shí)間和模型大小基本無(wú)關(guān),保持在一個(gè)極低的水平。

  1. 一致性:確保每個(gè) DbContext 實(shí)例使用相同的模型配置。

使用預(yù)編譯模型

  1. 生成編譯模型
    使用 EF Core 命令行工具,命令:
dotnet ef dbcontext optimize

這將生成 DbContext 的預(yù)編譯模型。我只有一個(gè) POCO 類,生成了 3 個(gè)文件,類名稱就是文件名稱。

[DbContext(typeof(DataContext))]
public partial class DataContextModel : RuntimeModel
{
    static DataContextModel()
    {
        var model = new DataContextModel();
        model.Initialize();
        model.Customize();
        _instance = model;
    }

    private static DataContextModel _instance;
    public static IModel Instance => _instance;

    partial void Initialize();

    partial void Customize();
}
public partial class DataContextModel
{
    partial void Initialize()
    {
        var deviceDatum = DeviceDatumEntityType.Create(this);

        DeviceDatumEntityType.CreateAnnotations(deviceDatum);

        AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
        AddAnnotation("ProductVersion", "8.0.0-rc.2.23480.1");
        AddAnnotation("Relational:MaxIdentifierLength", 63);
        AddRuntimeAnnotation("Relational:RelationalModel", CreateRelationalModel());
    }

    private IRelationalModel CreateRelationalModel()
    {
	    // 這里面非常多描述類型的代碼,節(jié)約篇幅我就不寫全了。
        var relationalModel = new RelationalModel(this);

        var deviceDatum = FindEntityType("AspireSample.DeviceDatum")!;

        var defaultTableMappings = new List<TableMappingBase<ColumnMappingBase>>();
        deviceDatum.SetRuntimeAnnotation("Relational:DefaultMappings", defaultTableMappings);
        
	    ....
	    
        return relationalModel.MakeReadOnly();
    }
}
internal partial class DeviceDatumEntityType
{
    public static RuntimeEntityType Create(RuntimeModel model, RuntimeEntityType baseEntityType = null)
    {
        var runtimeEntityType = model.AddEntityType(
            "AspireSample.DeviceDatum",
            typeof(DeviceDatum),
            baseEntityType);

        var id = runtimeEntityType.AddProperty(
            "Id",
            typeof(string),
            propertyInfo: typeof(DeviceDatum).GetProperty("Id", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
            fieldInfo: typeof(DeviceDatum).GetField("<Id>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
            afterSaveBehavior: PropertySaveBehavior.Throw);
        id.TypeMapping = StringTypeMapping.Default.Clone(
            comparer: new ValueComparer<string>(
                (string v1, string v2) => v1 == v2,
                (string v) => v.GetHashCode(),
                (string v) => v),
            keyComparer: new ValueComparer<string>(
                (string v1, string v2) => v1 == v2,
                (string v) => v.GetHashCode(),
                (string v) => v),
            providerValueComparer: new ValueComparer<string>(
                (string v1, string v2) => v1 == v2,
                (string v) => v.GetHashCode(),
                (string v) => v),
            mappingInfo: new RelationalTypeMappingInfo(
                dbType: System.Data.DbType.String));
                
        ......

        var key = runtimeEntityType.AddKey(
            new[] { id });
        runtimeEntityType.SetPrimaryKey(key);

        return runtimeEntityType;
    }

    public static void CreateAnnotations(RuntimeEntityType runtimeEntityType)
    {
        runtimeEntityType.AddAnnotation("Relational:FunctionName", null);
        runtimeEntityType.AddAnnotation("Relational:Schema", null);
        runtimeEntityType.AddAnnotation("Relational:SqlQuery", null);
        runtimeEntityType.AddAnnotation("Relational:TableName", "devicedata");
        runtimeEntityType.AddAnnotation("Relational:ViewName", null);
        runtimeEntityType.AddAnnotation("Relational:ViewSchema", null);

        Customize(runtimeEntityType);
    }

    static partial void Customize(RuntimeEntityType runtimeEntityType);
}

可以看到,優(yōu)化工具幫我們生成了非常多的代碼,尤其是與類型描述相關(guān)的代碼,因此,如果我們修改模型,那么必須重新執(zhí)行一遍對(duì)應(yīng)的生成指令。

  1. 修改 DbContext
    修改你的 DbContext 類,讓它使用這個(gè)預(yù)編譯模型。
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    if (!optionsBuilder.IsConfigured)
    {
        // 指定編譯模型的使用
        optionsBuilder.UseModel(CompiledModels.MyCompiledModel.Instance);
    }
}

權(quán)衡利弊

核心優(yōu)點(diǎn):

  1. 提升啟動(dòng)速度,對(duì)實(shí)體類型較多的 DbContext 尤其顯著。

缺點(diǎn):

  1. 不支持全局查詢過(guò)濾、Lazy loading proxies、Change tracking proxies 和自定義 IModelCacheKeyFactory 。
  2. 每次修改模型都必須重新生成優(yōu)化代碼。

不支持的東西很多,每次修改模型還需要重新生成就非常麻煩,因此,如果不是真的啟動(dòng)速度已經(jīng)非常慢了不建議使用。

后記

我在使用 EF Core 的 Compiled Model 之后依然提示相同的錯(cuò)誤,后來(lái)發(fā)現(xiàn)錯(cuò)誤是從 Reflection 相關(guān)類爆出的,而不是 EF Core 的相關(guān)類。所以錯(cuò)誤里說(shuō)的 Compiled Model 和 EF Core 的 Compiled Model 概念不同,應(yīng)該指 AOT 不支持反射中動(dòng)態(tài)加載,需要提前編譯。現(xiàn)在 EF Core 還沒(méi)完全準(zhǔn)備好,因此,重申一下,EF Core 8 暫時(shí)不支持 AOT文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-746865.html

參考

  • Announcing Entity Framework Core 6.0 Preview 5: Compiled Models - .NET Blog (microsoft.com)
  • Advanced Performance Topics | Microsoft Learn

到了這里,關(guān)于EF Core預(yù)編譯模型Compiled Model的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(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)文章

  • 【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日
    瀏覽(23)
  • Net Core中使用EF Core連接Mysql數(shù)據(jù)庫(kù)

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

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

    2024年01月24日
    瀏覽(28)
  • EF Core + MySQL 基本增刪改查

    EF Core + MySQL 基本增刪改查

    基于EF Core + MySQL的基本增刪改查,示例是基于.NET6 + EF Core + MySQL 創(chuàng)建實(shí)體和數(shù)據(jù)庫(kù)、EFCore 數(shù)據(jù)遷移項(xiàng)目基礎(chǔ)上的內(nèi)容增加。同時(shí)也是對(duì)基于Canal實(shí)現(xiàn)MySQL 8.0 數(shù)據(jù)庫(kù)數(shù)據(jù)同步項(xiàng)目的驗(yàn)證。 Controllers----添加----控制器,選擇api----包含讀寫操作的API控制器。 將上下文類注入到User

    2024年02月08日
    瀏覽(23)
  • 使用EF Core創(chuàng)建webapi接口(二)

    使用EF Core創(chuàng)建webapi接口(二)

    有錯(cuò)誤歡迎大家給我指正 說(shuō)明:netcore webapi+net6+EF?Core版本,codefirst模式(代碼創(chuàng)建數(shù)據(jù)庫(kù)) 1.netcore webapi+net6+EF?Core版本,dbfirst模式(代碼生成數(shù)據(jù)庫(kù))見(jiàn):使用EF Core創(chuàng)建webapi接口(一)-CSDN博客 2.netcore webapi+net6+EF?Core+vue前后端聯(lián)動(dòng)版本,見(jiàn)netcore webapi+net6+EF Core+vue3前后端聯(lián)動(dòng)-CSD

    2024年02月21日
    瀏覽(25)
  • EF Core 在實(shí)際開(kāi)發(fā)中,如何分層?

    EF Core 在實(shí)際開(kāi)發(fā)中,如何分層?

    分層就是將 EF Core 放在單獨(dú)的項(xiàng)目中,其它項(xiàng)目如 Asp.net core webapi 項(xiàng)目引用它 這樣的好處是解耦和項(xiàng)目職責(zé)的清晰劃分,并且可以重用 EF Core 項(xiàng)目 但是也會(huì)數(shù)據(jù)庫(kù)遷移變得復(fù)雜起來(lái) 創(chuàng)建一個(gè) .NET 類庫(kù)項(xiàng)目,項(xiàng)目名字為 BooksEFCore 引用以下 Nuget 包 Microsoft.EntityFrameworkCore.Relati

    2024年01月24日
    瀏覽(25)
  • Ef Core花里胡哨系列(4) 多租戶

    當(dāng)然,我們要考慮設(shè)計(jì)問(wèn)題,例如,切換 Schema 或者改變數(shù)據(jù)庫(kù)時(shí), Ef Core 同樣也會(huì)刷新改實(shí)體的緩存,所以,首次查詢將會(huì)很慢,不適合大表。 在我的上一篇博客中 [Ef Core花里胡哨系列(3) 動(dòng)態(tài)修改實(shí)體對(duì)應(yīng)的表(分表)、多租戶] 中我們實(shí)現(xiàn)了如何分表,同理,我們可以用近

    2024年02月03日
    瀏覽(19)
  • 如何在 EF Core 中使用樂(lè)觀并發(fā)控制

    如何在 EF Core 中使用樂(lè)觀并發(fā)控制

    樂(lè)觀并發(fā)控制是一種處理并發(fā)訪問(wèn)的數(shù)據(jù)的方法,它基于一種樂(lè)觀的假設(shè),即認(rèn)為并發(fā)訪問(wèn)的數(shù)據(jù)沖突的概率很低。在樂(lè)觀并發(fā)控制中,系統(tǒng)不會(huì)立即對(duì)并發(fā)訪問(wèn)的數(shù)據(jù)進(jìn)行加鎖,而是在數(shù)據(jù)被修改時(shí),再檢查是否有其他并發(fā)操作已經(jīng)修改了數(shù)據(jù)。如果檢測(cè)到?jīng)_突,系統(tǒng) 再采

    2024年02月04日
    瀏覽(18)
  • EF Core實(shí)操,數(shù)據(jù)庫(kù)生成實(shí)體,遷移

    EF Core實(shí)操,數(shù)據(jù)庫(kù)生成實(shí)體,遷移

    大家好,我是行不更名,坐不改姓的宋曉剛,下面將帶領(lǐng)大家進(jìn)入C#編程EF Core數(shù)據(jù)庫(kù)基礎(chǔ)入門知識(shí),如何連接數(shù)據(jù)庫(kù),如何編寫代碼,跟上我的步伐進(jìn)入EF Core數(shù)據(jù)庫(kù)下的世界。 家人們,如果有什么不懂,可以留言,或者加我聯(lián)系方式,一起進(jìn)入微軟技術(shù)的開(kāi)拓。 微信:153

    2024年01月22日
    瀏覽(20)
  • ASP.NET Core Web API入門之三:使用EF Core

    ASP.NET Core Web API入門之三:使用EF Core

    一般來(lái)講我們做項(xiàng)目都會(huì)用實(shí)體類跟數(shù)據(jù)庫(kù)實(shí)體進(jìn)行關(guān)系對(duì)應(yīng),這樣的好處方便我們維護(hù)、增刪改查,并且可以減少SQL的編寫,從而統(tǒng)一風(fēng)格,那么 Entity Framework Core 就是很不錯(cuò)的ORM框架。 1、跨數(shù)據(jù)庫(kù)支持能力強(qiáng)大,只需修改配置就可以輕松實(shí)現(xiàn)數(shù)據(jù)庫(kù)切換。 2、提升了開(kāi)發(fā)效

    2024年02月10日
    瀏覽(21)
  • 試試這 6 個(gè)小技巧,提升 EF Core 性能

    試試這 6 個(gè)小技巧,提升 EF Core 性能

    Entity FrameWork(簡(jiǎn)稱 EF)以面向?qū)ο蟮姆绞讲僮鲾?shù)據(jù)庫(kù)給開(kāi)發(fā)人員帶來(lái)了很大的便利性,但其性能問(wèn)題從面世以來(lái)就一直就被廣大的 .NET 生態(tài)開(kāi)發(fā)技術(shù)人員所吐槽,然而,它真的那么不堪使用嗎?試試下面這 6 個(gè)小技巧,瞬間極大提升 EF Core 性能: AsNoTracking 在項(xiàng)目開(kāi)發(fā)的時(shí)候

    2024年02月04日
    瀏覽(33)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包