星期六, 3月 16, 2019

[EF] 使用 Store Procedure

練習在 EF 的 edm 上使用 Store Procedure

把 Store Procedure 匯入

[EF] 使用 Store Procedure-1

匯入後在 DbContext 內可以看見匯入自動產生的 Code
namespace EFStoreProcedure
{
    using System;
    using System.Data.Entity;
    using System.Data.Entity.Infrastructure;
    using System.Data.Entity.Core.Objects;
    using System.Linq;
    
    public partial class EFDbContext : DbContext
    {
        public EFDbContext()
            : base("name=EFDbContext")
        {
        }
    
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            throw new UnintentionalCodeFirstException();
        }
    
        public virtual DbSet<Employ> Employ { get; set; }
    
        public virtual int uspEmploy_Insert(string empNO, string name, Nullable<System.DateTime> hireDate)
        {
            var empNOParameter = empNO != null ?
                new ObjectParameter("EmpNO", empNO) :
                new ObjectParameter("EmpNO", typeof(string));
    
            var nameParameter = name != null ?
                new ObjectParameter("Name", name) :
                new ObjectParameter("Name", typeof(string));
    
            var hireDateParameter = hireDate.HasValue ?
                new ObjectParameter("HireDate", hireDate) :
                new ObjectParameter("HireDate", typeof(System.DateTime));
    
            return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("uspEmploy_Insert", empNOParameter, nameParameter, hireDateParameter);
        }
    
        public virtual ObjectResult<uspEmploy_Select_Result> uspEmploy_Select()
        {
            return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<uspEmploy_Select_Result>("uspEmploy_Select");
        }
    }
}

點選目標 Table 並點選 [預存程序對應],在這邊設定 insert、update 和 delete 對應的 Store Procedure

[EF] 使用 Store Procedure-2

只針對 insert 進行設定,選擇 uspEmploy_Insert

[EF] 使用 Store Procedure-3

在 Console 內執行並觀察結果
namespace EFStoreProcedure
{
    class Program
    {
        static void Main(string[] args)
        {
            EFDbContext context = new EFDbContext();
            context.Employ.Add(new Employ { EmpNO = "10801", Name = "張三", HireDate = new DateTime(2019, 3, 16) });
            context.SaveChanges();

            var data = context.uspEmploy_Select();
            foreach (var item in data)
            {
                Console.WriteLine($"{item.EmpNO}-{item.Name}-{item.HireDate}");
            }

        }
    }
}
執行觀察結果

[EF] 使用 Store Procedure-4

透過 SQL Profile 來觀察是否使用 Store Procedure

[EF] 使用 Store Procedure-5

[EF] 使用 Store Procedure-6

加入 Store Procedure 時,預設是會勾選 [將選取的預存程序和函數匯入實體模型],匯入 uspEmploy_Delete 時故意取消

[EF] 使用 Store Procedure-7

在模型瀏覽器內就可以發現,uspEmploy_Delete 只出現在 Store 內

[EF] 使用 Store Procedure-8

點選 [加入函式匯入]

[EF] 使用 Store Procedure-9

把 uspEmploy_Delete 加入,在這邊是可以進行更名,沒有一定要跟 Store 內名稱一樣

[EF] 使用 Store Procedure-10

這樣 uspEmploy_Delete 就會出現在兩邊

[EF] 使用 Store Procedure-11

沒有留言:

張貼留言