星期一, 4月 22, 2019

[EF] Table 對應多 Entities

根據該篇文章 - 分割的資料表設計工具 的練習筆記,目的是要把 1 個 Table 拆成 2 個 Entity 來使用

MSDN 說明
使用消極式載入來載入您的物件時,您可能想要使用資料表分割的其中一個原因延遲載入的某些屬性。 您可以分隔可能包含非常大量的資料分成個別的實體,並只載入時所需的屬性。
在網路看見的介紹是二進位欄位資料,假如一起抓出來會影響效能,因此利用該方式,把二進位欄位資料拆到另外一個 Entity 去,需要顯示時才載進來使用顯示,該文章是把 Person.HireDate 拆到 HireInfo Entity 去

School 範例資料庫 的 Person 拉進來使用

[EF] Table 對應多 Entities-1


增加實體

[EF] Table 對應多 Entities-2

建立 HireInfo Entity

[EF] Table 對應多 Entities-3

把 Person.HireDate  Property 剪下

[EF] Table 對應多 Entities-4

把 HireDate Property 貼上 HireInfo Entity 上

[EF] Table 對應多 Entities-5

加入 Person 和 HireInfo 的 1 對 1 關聯

[EF] Table 對應多 Entities-6

輸入關聯相關資訊

[EF] Table 對應多 Entities-7

點選關聯屬性內的 [參考限制式]

[EF] Table 對應多 Entities-8

輸入參考限制式相關資料

[EF] Table 對應多 Entities-9

確認 Person 和 HireInfo 資料表對應

[EF] Table 對應多 Entities-10

設定完成圖

[EF] Table 對應多 Entities-11

C# 測試 Code

namespace TableSplitting
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var context = new SchoolEntities())
            {
                context.Database.Log = Console.WriteLine;

                /***** 新增 Person 資料 *****/
                Person person = new Person()
                {
                    FirstName = "Kimberly",
                    LastName = "Morgan",
                    Discriminator = "Instructor",
                };

                person.HireInfo = new HireInfo()
                {
                    HireDate = DateTime.Now
                };

                context.Person.Add(person);
                context.SaveChanges();

                /***** 執行 Query 來觀察產生的 TSQL 語法 *****/
                // 沒有載入 HireDate 資訊
                var existingPerson = context.Person.FirstOrDefault();

                // Lazy Loading 載入 HireDate 資訊
                var hireInfo = existingPerson.HireInfo;

            }
        }
    }
}
新增資料的 TSQL 語法

[EF] Table 對應多 Entities-12

FirstOfDefault() 時產生的 Select 語法欄位,並沒有 HireDate 欄位資訊,是在呼叫 HireInfo 時,才又產生 TSQL 語法去找出 HireDate 欄位資訊

[EF] Table 對應多 Entities-13

沒有留言:

張貼留言