星期日, 4月 21, 2019

[EF] Entity 對應多 Table

根據該篇文章 - 分割的實體設計工具 的練習筆記,目的是要把 2 個 Entity 整合為 1 個並對應到 2 個 Table 去

MSDN 說明
當多個資料表共用共同的索引鍵時,您可以將實體對應至多個資料表。 適用於將實體類型對應至兩個資料表的概念,很容易擴大為將實體類型對應至兩個以上的資料表。
該文章的範例並不在 School 資料庫內,文章內是另外建立一個 EntitySplitting DB 來放 Person 和 PersonInfo 這兩個 Table
CREATE TABLE [dbo].[Person] (
  [PersonId] INT IDENTITY (1, 1) NOT NULL,
  [FirstName] NVARCHAR (200) NULL,
  [LastName] NVARCHAR (200) NULL,
  CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED ([PersonId] ASC));

CREATE TABLE [dbo].[PersonInfo] (
  [PersonId] INT NOT NULL,
  [Email] NVARCHAR (200) NULL,
  [Phone] NVARCHAR (50) NULL,
  CONSTRAINT [PK_PersonInfo] PRIMARY KEY CLUSTERED ([PersonId] ASC),
  CONSTRAINT [FK_Person_PersonInfo] FOREIGN KEY ([PersonId]) REFERENCES [dbo].[Person] ([PersonId]) ON DELETE CASCADE);
把 Person 和 PersonInfo 拉進來

[EF] Entity 對應多 Table-1

剪下 PersonInfo 的 Email 和 Phone Property

[EF] Entity 對應多 Table-2

在 Person 上貼上

[EF] Entity 對應多 Table-3

Email 和 Phone 從 PersonInfo 移轉至 Person 上去

[EF] Entity 對應多 Table-4

在 Person 上進行資料表對應,如下圖所示,對應之後才刪除 PersonInfo,千萬不要先刪除 PersonInfo,要進行對應時會沒有 PersonInfo 選項可以選

[EF] Entity 對應多 Table-5

執行測試
namespace MapEntityToTables
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var context = new EntitySplittingEntities())
            {
                context.Database.Log = Console.WriteLine;

                var person = new Person
                {
                    FirstName = "John",
                    LastName = "Doe",
                    Email = "john@example.com",
                    Phone = "555-555-5555"
                };

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

                foreach (var item in context.Person)
                {
                    Console.WriteLine(item.FirstName);
                }
            }
        }
    }
}
可以看見有兩段 Insert 語法產生

[EF] Entity 對應多 Table-6

Select 資料時會自動進行 JOIN

[EF] Entity 對應多 Table-7

沒有留言:

張貼留言