2020-03-31 20:00 繼承\(zhòng)序列\(zhòng)支持字段\帶構(gòu)造函數(shù)的實體類\注入服務(wù)

提綱

  1. 繼承
  2. 序列
  3. 字段支持
  4. 帶非空構(gòu)造函數(shù)的實體類
  5. 注入服務(wù)

繼承

  • EF Core 僅支持每個層次結(jié)構(gòu)一個表(TPH)模式。

TPH 使用單個表來存儲層次結(jié)構(gòu)中所有類型的數(shù)據(jù),而
鑒別器列 Discriminator 用于標識每行所表示的類型。

默認下產(chǎn)生的鑒別器列會是 影子屬性
你可以如下配置 鑒別器列, 不過一般貌似也不需要
modelBuilder.Entity<Blog>().HasDiscriminator<string>("blog_type").HasValue<Blog>("blog_base") .HasValue<RssBlog>("blog_rss");
鑒別器列 也可以是常規(guī)的非影子屬性
modelBuilder.Entity<Blog>().HasDiscriminator(b => b.BlogType);

  • 抽象類的直接子類可以創(chuàng)建多個表
  • 在某一個非抽象類的子類之前加上 [Table] 標注沒有效果,

數(shù)據(jù)還是會存放在父類的表中,根據(jù)鑒別器列來劃分數(shù)據(jù).

  • 共享列

默認情況下,當(dāng)層次結(jié)構(gòu)中的兩個同級實體類型具有相同的屬性時,它們將映射到兩個單獨的列。
如果它們的類型相同,則可以映射到相同的數(shù)據(jù)庫列, 指定屬性具有相同的列名稱即可

modelBuilder.Entity<Blog>().Property(b => b.Url).HasColumnName("Url");
modelBuilder.Entity<RssBlog>().Property(b => b.Url).HasColumnName("Url");

序列

部分數(shù)據(jù)庫支持,但是有數(shù)據(jù)庫的專用語法

modelBuilder.HasSequence<int>("OrderNumbersSerial");  // 簡單定義
modelBuilder.HasSequence<int>("OrderNumbers", schema: "shared")
        .StartsAt(1000)
        .IncrementsBy(5);

modelBuilder.Entity<Order>()
        .Property(o => o.OrderNo)
        .HasDefaultValueSql("NEXT VALUE FOR shared.OrderNumbers");

字段支持

就是說 EF 能夠?qū)⒆侄味菍傩杂成涞奖淼牧?
這個知道就行了, 暫時不會有這個需求.

帶非空參數(shù)構(gòu)造函數(shù)的實體

知道有這個就行,除非對效率要求特別高

如果 EF Core 查找的參數(shù)化構(gòu)造函數(shù)參數(shù)名稱和類型相匹配的映射屬性,則它將改為調(diào)用這些屬性具有值的參數(shù)化構(gòu)造函數(shù),然后顯式設(shè)置未在構(gòu)造函數(shù)中的屬性

  • 并非所有屬性都需要具有構(gòu)造函數(shù)參數(shù)
  • 參數(shù)類型和名稱必須與屬性類型和名稱相匹配,但在參數(shù)采用 camel 大小寫格式時,屬性可以采用 Pascal 大小寫形式, 例如 參數(shù)名稱為 id , 屬性名稱為 Id
  • 構(gòu)造函數(shù)中不能設(shè)置導(dǎo)航屬性, 例如 Post 類中的 Blog 屬性

只讀屬性

有了 帶非空參數(shù)構(gòu)造函數(shù)的實體, 那么實體現(xiàn)在支持 只讀屬性

 public Post(int id, string title)
    {
        Id = id;
        Title = title;
    }
    public int Id { get; private set; }

注入服務(wù), 將"服務(wù)"注入到實體類型的構(gòu)造函數(shù)

這個貌似會降低效率,而且貌似會代碼跨 DbContext 操作實體的麻煩..知道有這個就行
*DbContext-當(dāng)前上下文實例,也可以類型化為派生的 DbContext 類型
*ILazyLoader-延遲加載服務(wù)-有關(guān)更多詳細信息
*Action<object, string>-延遲加載委托
*IEntityType-與此實體類型關(guān)聯(lián)的 EF Core 元數(shù)據(jù)
構(gòu)造函數(shù)需要私有

private Blog(BloggingContext context)
    {
        Context = context;
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容