星期一, 4月 29, 2019

[EF] Store Procedure - identity

該篇筆記 - [EF] Store Procedure,只記錄
  • 預存程序對應並透過 SQL Profile 觀察
  • 預存程序和函式匯入實體模型
閱讀該篇文章 - 設計工具的 CUD 預存程序,發現有使用 idnetity 欄位和使用 Store Procedure 注意事項,就記錄一下囉

Store Procedure - InsertPerson TSQL 語法
CREATE PROCEDURE [dbo].[InsertPerson]
    @LastName nvarchar(50),
    @FirstName nvarchar(50),
    @HireDate datetime,
    @EnrollmentDate datetime,
    @Discriminator nvarchar(50)
AS
INSERT INTO dbo.Person (
    LastName,
    FirstName,
    HireDate,
    EnrollmentDate,
    Discriminator)
VALUES (
    @LastName, 
    @FirstName, 
    @HireDate, 
    @EnrollmentDate, 
    @Discriminator);

SELECT SCOPE_IDENTITY() AS NewPersonID;
GO
Person Entity 的預存程序對應設定


C# Code 執行測試
namespace EFStoreProcedure2
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var context = new SchoolEntities())
            {
                var newInstructor = new Person
                {
                    FirstName = "Robyn",
                    LastName = "Martin",
                    HireDate = DateTime.Now,
                    Discriminator = "Instructor"
                };

                // Add the new object to the context.
                context.Person.Add(newInstructor);

                Console.WriteLine("Added {0} {1} to the context.",
                    newInstructor.FirstName, newInstructor.LastName);

                Console.WriteLine("Before SaveChanges, the PersonID is: {0}",
                    newInstructor.PersonID);

                // SaveChanges will call the InsertPerson sproc.  
                // The PersonID property will be assigned the value
                // returned by the sproc.
                context.SaveChanges();

                Console.WriteLine("After SaveChanges, the PersonID is: {0}",
                    newInstructor.PersonID);
            }
        }
    }
}
執行結果


MSDN 文章說明,使用 Store Procedure 注意事項
預存程序的對應 CUD 作業時的考量,當將 CUD 作業對應至預存程序中,適用下列考量:
  1. 如果您要對應 CUD 作業的其中一個預存程序,將對應所有人都。 如果您不會對應所有三個,對應的作業將會失敗,如果執行,而且UpdateException就會擲回。
  2. 您必須將預存程序的每個參數對應至實體屬性。
  3. 如果伺服器就會產生主索引鍵值插入的資料列,您必須將此值對應回實體的索引鍵屬性。 在範例中,如下所示InsertPerson預存程序會傳回新建立的主索引鍵做為預存程序的結果集的一部分。 主索引鍵對應到實體索引鍵 (PersonID) 使用**<加入結果繫結>** EF 設計工具的功能。
  4. 預存程序呼叫是對應與 1:1 概念模型中的實體。 例如,如果您實作在概念模型,然後對應中的繼承階層架構 CUD 預存程序父代(基本) 和子(衍生) 的實體,儲存子系變更都只會呼叫子的預存程序,就不會觸發父的預存程序呼叫。
針對第三點測試,假如預存程序對應時,沒有設定 NewPersonID 的話,不會出現任何錯誤訊息,就 identity 欄位不會帶回來而已,執行後如下圖


沒有留言:

張貼留言