EF6.x 繼承策略之TPT策略

Table per Type (TPT):用外鍵關(guān)系來表示繼承關(guān)系。

我們可以使用單個實體通過實體拆分來扁平化繼承層次中表示TPT皆尔,最終使用數(shù)據(jù)庫中的單表來維護數(shù)據(jù)。換句話說慷蠕,實體拆分涉及將概念層中的單個實體映射到存儲(數(shù)據(jù)庫)層中的多個表榄审。

  • Entity Splitting (實體拆分)

我們定義如下雇員類杆麸,其中EmployeeId浪感、Name影兽、CreateTime莱革、ModifiedTime屬性作為Employye主表字段,而PhoneNumber和DetailAddress作為EmployeeDetail詳細表字段捐名。

using System;

namespace EntityFramework_CreateDbContext.Entity
{
    public class Employee
    {
        public int EmployeeId { get; set; }

        public string Name { get; set; }
        public string PhoneNumber { get; set; }
        public string DetailAddress { get; set; }
        public DateTime CreateTime { get; set; }
        public DateTime ModifiedTime { get; set; }
    }
}

在默認配置下闹击,EF最終映射會在數(shù)據(jù)庫單表(Employee)中生成所有的列,但是我們需要兩個表來存儲這些信息贺归,所以通過繼承自DbContext類的OnModelCreating方法來改變這個配置断箫。

using System.Data.Entity.ModelConfiguration;
using EntityFramework_CreateDbContext.Entity;

namespace EntityFramework_CreateDbContext.Map
{
    public class EmployeeMap:EntityTypeConfiguration<Employee>
    {
        public EmployeeMap()
        {
            Map(map =>
            {
                map.Properties(p=>new
                {
                    p.EmployeeId,
                    p.Name,
                    p.CreateTime,
                    p.ModifiedTime
                });
                map.ToTable("Employees");
            }).Map(map =>
            {
                map.Properties(p=>new
                {
                    p.PhoneNumber,
                    p.DetailAddress
                });
                map.ToTable("EmployeeDetails");
            });
        }
    }
}

經(jīng)過上面配置后,那么生成的數(shù)據(jù)庫中的表如下:

image.png

我們發(fā)現(xiàn)婶熬,它生成了2張表尸诽,并且它們之間通過EmployeeId主外鍵進行關(guān)聯(lián)盯另。

當(dāng)我們對Employee實體執(zhí)行插入操作時,EF會生成Employees和EmployeeDetails兩個表的插入語句鸳惯。

 db.Database.Log = Console.WriteLine;
                var employess=new Employee()
                {
                    CreateTime = DateTime.Now,
                    ModifiedTime = DateTime.Now,
                    Name = "楊鈺涵",
                    PhoneNumber = "189********",
                    DetailAddress = "中國"
                };
                db.Employees.Add(employess);
                db.SaveChanges();

控制臺輸出sql語句:

Opened connection at 2019/3/24 5:28:54 +08:00


SELECT Count(*)
FROM INFORMATION_SCHEMA.TABLES AS t
WHERE t.TABLE_SCHEMA + '.' + t.TABLE_NAME IN ('dbo.Customers','dbo.Orders','dbo.Employees','dbo.Courses','dbo.StudentCourses','dbo.Students','dbo.StudentContacts','dbo.StudentInfos','dbo.EmployeeDetails')
    OR t.TABLE_NAME = 'EdmMetadata'


-- Executing at 2019/3/24 5:28:54 +08:00

-- Completed in 43 ms with result: 9



Closed connection at 2019/3/24 5:28:54 +08:00

Opened connection at 2019/3/24 5:28:54 +08:00

SELECT
    [GroupBy1].[A1] AS [C1]
    FROM ( SELECT
        COUNT(1) AS [A1]
        FROM [dbo].[__MigrationHistory] AS [Extent1]
        WHERE [Extent1].[ContextKey] = @p__linq__0
    )  AS [GroupBy1]


-- p__linq__0: 'EntityFramework_CreateDbContext.EfDbContext' (Type = String, Size = 4000)

-- Executing at 2019/3/24 5:28:54 +08:00

-- Completed in 44 ms with result: SqlDataReader



Closed connection at 2019/3/24 5:28:55 +08:00

Opened connection at 2019/3/24 5:28:55 +08:00

SELECT TOP (1)
    [Project1].[C1] AS [C1],
    [Project1].[MigrationId] AS [MigrationId],
    [Project1].[Model] AS [Model],
    [Project1].[ProductVersion] AS [ProductVersion]
    FROM ( SELECT
        [Extent1].[MigrationId] AS [MigrationId],
        [Extent1].[Model] AS [Model],
        [Extent1].[ProductVersion] AS [ProductVersion],
        1 AS [C1]
        FROM [dbo].[__MigrationHistory] AS [Extent1]
        WHERE [Extent1].[ContextKey] = @p__linq__0
    )  AS [Project1]
    ORDER BY [Project1].[MigrationId] DESC


-- p__linq__0: 'EntityFramework_CreateDbContext.EfDbContext' (Type = String, Size = 4000)

-- Executing at 2019/3/24 5:28:55 +08:00

-- Completed in 20 ms with result: SqlDataReader



Closed connection at 2019/3/24 5:28:55 +08:00

Opened connection at 2019/3/24 5:28:55 +08:00

Started transaction at 2019/3/24 5:28:55 +08:00

INSERT [dbo].[Employees]([Name], [CreateTime], [ModifiedTime])
VALUES (@0, @1, @2)
SELECT [EmployeeId]
FROM [dbo].[Employees]
WHERE @@ROWCOUNT > 0 AND [EmployeeId] = scope_identity()


-- @0: '楊鈺涵' (Type = String, Size = -1)

-- @1: '2019/3/24 5:28:53' (Type = DateTime2)

-- @2: '2019/3/24 5:28:53' (Type = DateTime2)

-- Executing at 2019/3/24 5:28:55 +08:00

-- Completed in 16 ms with result: SqlDataReader



INSERT [dbo].[EmployeeDetails]([EmployeeId], [PhoneNumber], [DetailAddress])
VALUES (@0, @1, @2)

-- @0: '1' (Type = Int32)

-- @1: '189********' (Type = String, Size = -1)

-- @2: '中國' (Type = String, Size = -1)

-- Executing at 2019/3/24 5:28:55 +08:00

-- Completed in 19 ms with result: 1



Committed transaction at 2019/3/24 5:28:55 +08:00

Closed connection at 2019/3/24 5:28:55 +08:00


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市辅鲸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌例书,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件自沧,死亡現(xiàn)場離奇詭異树瞭,居然都是意外死亡,警方通過查閱死者的電腦和手機晒喷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門凉敲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人荡陷,你說我怎么就攤上這事』展辏” “怎么了唉地?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長极颓。 經(jīng)常有香客問我群嗤,道長,這世上最難降的妖魔是什么狂秘? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任者春,我火速辦了婚禮,結(jié)果婚禮上钱烟,老公的妹妹穿的比我還像新娘嫡丙。我一直安慰自己读第,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布羊瘩。 她就那樣靜靜地躺著盼砍,像睡著了一般逝她。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上黔宛,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天,我揣著相機與錄音觉渴,去河邊找鬼徽惋。 笑死,一個胖子當(dāng)著我的面吹牛险绘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播宦棺,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼代咸,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了呐芥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤弧腥,失蹤者是張志新(化名)和其女友劉穎潮太,沒想到半個月后虾攻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體更鲁,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年漂坏,在試婚紗的時候發(fā)現(xiàn)自己被綠了媒至。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡驯绎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出剩失,到底是詐尸還是另有隱情,我是刑警寧澤拴孤,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布演熟,位于F島的核電站,受9級特大地震影響绽媒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜是辕,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一猎提、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧锨苏,春花似錦、人聲如沸伞租。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽祟同。三九已至,卻和暖如春晕城,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背砖顷。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工赃梧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人槽奕。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓粤攒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親夯接。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內(nèi)容

  • 產(chǎn)品:多燕瘦 1. 請寫出你現(xiàn)在行業(yè)的5個目標(biāo)客戶群 1 盔几、團隊領(lǐng)導(dǎo) 2逊拍、美容院老板 3、 健身操老板 4芯丧、 白領(lǐng)...
    IreneSiah00閱讀 638評論 0 1
  • 與他在一起應(yīng)該有到三年了吧轮听,我想了很久也想不起來具體的時間,只是記得算起今日血巍,恰好是三年的。我想去問問他述寡,拿著手機...
    布聽風(fēng)閱讀 208評論 0 1