星期四, 8月 15, 2019

[EF] identity

Master-Detail 架構下,假如 Master PK 是使用 identity 情況下,通常都必須先儲存 Master Table 後取回 identity 值,再把 identity 塞進 Detail Table,學習 EF 時發現,竟然直接設定就行

[EF] 學校範例資料庫 內可以看出,Person 和 StudentGrade 是 1 對 多關係,就拿它當範例來使用

[EF] 取得 identity-2

C# Code 測試
using EFIdentity.Models;

namespace EFIdentity
{
    class Program
    {
        static void Main(string[] args)
        {
            using (SchoolContext context = new SchoolContext())
            {
                // Add() 多載可以回傳 TEntity
                var p = context.Person.Add(new Person() { LastName = "Identity", FirstName = "demo", EnrollmentDate = DateTime.Today, Discriminator = "Student" });
                // StudentGrade.StudentID 直接設定 Person.Add() 回傳的 TEntity.PersonID
                context.StudentGrade.Add(new StudentGrade() { StudentID = p.PersonID, CourseID = 4022, Grade = 3 });
                context.StudentGrade.Add(new StudentGrade() { StudentID = p.PersonID, CourseID = 4041, Grade = 4 });
                context.StudentGrade.Add(new StudentGrade()
                {
                    StudentID = p.PersonID,
                    CourseID = 4061,
                    Grade = 5
                });
                // 透過 SaveChange() 進行資料儲存
                context.SaveChanges();
            }
        }
    }
}
從 SSMS 內去查詢結果

[EF] 取得 identity-1

從 SQL Profile 去側錄產生的 TSQL 語法,事後才想說要觀察 TSQL,所以和上圖的 identity 不同

[EF] 取得 identity-3
exec sp_executesql N'INSERT [dbo].[StudentGrade]([CourseID], [StudentID], [Grade])
VALUES (@0, @1, @2)
SELECT [EnrollmentID]
FROM [dbo].[StudentGrade]
WHERE @@ROWCOUNT > 0 AND [EnrollmentID] = scope_identity()',N'@0 int,@1 int,@2 decimal(3,2)',@0=4022,@1=1068,@2=3.00

沒有留言:

張貼留言