asp.net core系列 23 EF模型配置(概述, 類型和屬性的包含與排除)

来源:https://www.cnblogs.com/MrHSR/archive/2019/02/15/10373374.html
-Advertisement-
Play Games

一.模型配置概述 EF使用一組約定基於實體類的定義來構建模型。 可指定其他配置以補充或替代約定的內容。本系列介紹的配置可應用於面向任何數據存儲的模型,以及面向任意關係資料庫時可應用的配置。 資料庫提供程式還可支持特定於具體數據存儲的配置,如Microsoft.EntityFrameworkCore. ...


一.模型配置概述

  EF使用一組約定基於實體類的定義來構建模型。 可指定其他配置以補充或替代約定的內容。本系列介紹的配置可應用於面向任何數據存儲的模型,以及面向任意關係資料庫時可應用的配置。

  資料庫提供程式還可支持特定於具體數據存儲的配置,如Microsoft.EntityFrameworkCore.SqlServer,Pomelo.EntityFrameworkCore.MySql 等,對於特定配置的文檔參考資料庫提供程式。

 

  1.1 使用 fluent API 配置模型

    可在派生上下文中重寫 OnModelCreating 方法,並使用 ModelBuilder API 來配置模型。 此配置方法最為有效,並可在不修改實體類的情況下指定配置。 Fluent API 配置具有最高優先順序,並將替代約定和數據註釋。下麵示例指定Blog類型的Url在保存時必填。如下所示:

    class MyContext : DbContext
    {
        public DbSet<Blog> Blogs { get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Blog>()
                .Property(b => b.Url)
                .IsRequired();
        }
    }

  

  1.2 使用數據註釋來配置模型

    也可將特性(稱為數據註釋)應用於類和屬性。 數據註釋會替代約定,但會被 Fluent API 配置替代。下麵示例指定Blog類型的Url在保存時必填。如下所示:

    public class Blog
    {
        public int BlogId { get; set; }
[Required(ErrorMessage
= "請輸入URL")] public string Url { get; set; } public ICollection<Post> Posts { get; set; } }
     [HttpPost]
     public async Task<IActionResult> Create([Bind("Url")] Blog blog)
      {
            if (ModelState.IsValid)
            {
                BloggingContext.Add<Blog>(blog);
                await BloggingContext.SaveChangesAsync();
            }
            return View();
      }

    在MVC中, 新增一條Blog數據,Url 欄位為空(包含空格),點擊提交時,在後臺Create中驗證,設置斷點查看ModelState.IsValid為false。

    其中取Url欄位的ErrorMessage信息是:ModelState["URL"].Errors[0].ErrorMessage 

     

二.類型的包含和排除約定   

   將類型(實體類型)包含到模型中意味著,EF會有該類型的元數據,並且會嘗試從資料庫讀取實例(讀取對應的數據表),以及將實例(實體對象數據)寫入到資料庫中。按照約定,在上下文的 DbSet 屬性中公開的類型(實體類型)會包含在模型中。 此外,在 OnModelCreating 方法中提及的類型(實體類型)也將包含在其中。 最後,通過以遞歸方式瀏覽已發現類型的導航屬性而找到的任何類型也會包含在模型中。下麵舉例一 一說明:

  

  2.1  類型包含約定

class MyContext : DbContext
{
    //公開Blog類型,將與資料庫表產生映射關係 
    public DbSet<Blog> Blogs { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
       //公開AuditEntry類型,將與資料庫表產生映射關係
        modelBuilder.Entity<AuditEntry>();
    }
}

    public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }

    //公開Post類型,通過導航屬性。將與資料庫表產生映射關係
    public List<Post> Posts { get; set; }
}

public class Post
{
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

    public Blog Blog { get; set; }
}

public class AuditEntry
{
    public int AuditEntryId { get; set; }
    public string Username { get; set; }
    public string Action { get; set; }
}

    上面示例中:(1)Blog,因為它是在上下文的 DbSet 屬性中公開的。(2)Post,因為它是通過 Blog.Posts 導航屬性發現的。(3) AuditEntry,因為它在 OnModelCreating 中提及。

 

  2.2 類型排除約定

     (1)可以使用數據註釋來從模型中排除類型。

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }

    public BlogMetadata Metadata { get; set; }
}

[NotMapped]
public class BlogMetadata
{
    public DateTime LoadedFromDatabase { get; set; }
}

    (2)也可以通過Fluent API 把模型中類型排除。

class MyContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Ignore<BlogMetadata>();
    }
}

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }

    public BlogMetadata Metadata { get; set; }
}

public class BlogMetadata
{
    public DateTime LoadedFromDatabase { get; set; }
}

 

 三.屬性的包含和排除約定

   模型中包含屬性意味著 EF 擁有該屬性的元數據,並將嘗試從資料庫讀取值或者向資料庫寫入值。按照約定,模型所含的那些公共屬性都擁有一個 getter 和一個 setter。

 

  3.1 數據註釋

     可以使用數據註釋方式來從模型中排除某個屬性

    public class Blog
    {
       //公開的屬性
        public int BlogId { get; set; }
        public string Url { get; set; }

       //排除的屬性
       [NotMapped]
        public DateTime LoadedFromDatabase { get; set; }
    }

 

   3.2 Fluent API

     也可以用Fluent API 從模型中排除某個屬性。

class MyContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>().Ignore(b => b.LoadedFromDatabase);
    }
}

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }

    public DateTime LoadedFromDatabase { get; set; }
}

 

  參考文獻:

    官方資料:創建並配置模型

           包括和排除類型

           包括和排除屬性

  


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 模塊:模塊是一系列常用功能的集合體,一個py文件就是一個模塊1、從文件級別組織程式,更方便管理隨著程式的發展,功能越來越多,為了方便管理,我們通常將程式分成一個個的文件,這樣做程式的結構更清晰,方便管理。這時我們不僅僅可以把這些文件當做腳本去執行,還可以把他們當做模塊來導入到其他的模塊中,實現了功能 ...
  • 春節假期結束了,大家陸續地重回到原來的生活軌道上。假期是一個很好的休息與調節的機會,同時,春節還有辭舊迎新的本意,它是新的輪迴的開端。 在 Python 社區里,剛發生了一件大事,同樣有開啟新紀元的意義:在"Python 之父" Guido van Rossum 宣佈卸任 BDFL(終身仁慈獨裁者) ...
  • 本著做題的心態,上了東莞理工學院的 oj 網;看了一下題目不想動手,在選擇難度的時候發現有些通過率和難度可能存在著某些關係,於是決定爬下這些數據簡單查看一下是否存在關係。 一、新建項目 我是用 Scrapy 框架爬取的(因為剛學沒多久,順便練練手)。首先,先新建 project (下載 Scarpy ...
  • wrk 是一個很簡單的 http 性能測試工具,沒有Load Runner那麼複雜,他和 apache benchmark(ab)同屬於HTTP性能測試工具,但是比 ab 功能更加強大,並且可以支持lua腳本來創建複雜的測試場景。 wrk 的一個很好的特性就是能用很少的線程壓出很大的併發量,原因是它 ...
  • 最近一位5年開發經驗的群友與我聊天 他說:最近慢慢的嘗試去看spring的源碼,學習spring,以前都只是會用就行了,但是越是到後面,發現只懂怎麼用還不夠,在面試的時候經常被問到一些開源框架的源碼問題,即使在網上各種百度,當時回答出來也會是很皮毛,不痛不癢的解答。 對於目前碰到的瓶頸,他不知道怎麼 ...
  • tomcat啟動maven工程的時候提示如下錯誤信息: An internal error occurred during: "Updating status for Tomcat v7.0 Server at localhost..." java.lang.NullPointerException ...
  • 1. server_code01 2. server_code02 3. server_code03 ...
  • 神奇的事件,折磨我 電腦關機重啟了一下關機之前正常的狀態沒有任何的異常出現,過了一會開機準備工作。神奇的事情tmd出現了!!!! 打開phpstudy 啟動... 嗯?apache亮紅報錯?? 第一反應趕快CMD httpd -t 查看咋地了 剛纔還好好的呢,咋一下掛了。 提示信息: httpd: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...