提綱
- 繼承
- 序列
- 字段支持
- 帶非空構(gòu)造函數(shù)的實體類
- 注入服務(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;
}