Entity Framework 6 Recipes 2nd Edition(10-1)譯->非Code Frist方式返回一個實體集合

来源:http://www.cnblogs.com/kid1412/archive/2016/01/19/5143814.html
-Advertisement-
Play Games

存儲過程存儲過程一直存在於任何一種關係型資料庫中,如微軟的SQL Server.存儲過程是包含在資料庫中的一些代碼,通常為數據執行一些操作,它能為數據密集型計算提高性能,也能執行一些為業務邏輯. 當你使用數據的時候,有時你會通過存儲過程來獲取它們.在本章, 我們探討一些EF在使用存儲過程時,需要關註...


存儲過程

存儲過程一直存在於任何一種關係型資料庫中,如微軟的SQL Server.存儲過程是包含在資料庫中的一些代碼,通常為數據執行一些操作,它能為數據密集型計算提高性能,也能執行一些為業務邏輯. 當你使用數據的時候,有時你會通過存儲過程來獲取它們.

在本章, 我們探討一些EF在使用存儲過程時,需要關註的地方。我們在本書的其它章節也使用了存儲過程, 但通常都是context為執行插入、更新和刪除動作。

在本章,我們將為你展示多種使用存儲過程的方式。

10-1. 非Code Frist方式返回一個實體集合

問題

想用非Code Frist方式從存儲過程里取得一個實體集合

解決方案

Code second (我把它譯為非Code Frist)是參照 Code-First 技術,為一個已經存在的資料庫建模的方式

我們假設有一個 POCO模型,如Listing 10-1所示:

Listing 10-1. The Customer POCO Model

public class Customer

{

public int CustomerId { get; set; }

public string Name { get; set; }

public string Company { get; set; }

public string ContactTitle { get; set; }

}

我們已經設置好了DbContext子類和Customer 實體集,如Listing 10-2所示:

Listing 10-2. The DbContext Subclass for Customer Entities

public class EF6RecipesContext : DbContext

{

public DbSet<Customer> Customers { get; set; }

public EF6RecipesContext() : base("name=EF6CodeFirstRecipesContext")

{

}

protected override void OnModelCreating(DbModelBuilder modelBuilder)

{

base.OnModelCreating(modelBuilder);

modelBuilder.Types<Customer>()

.Configure(c =>

{

c.HasKey(cust => cust.CustomerId);

c.Property(cust => cust.CustomerId)

.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

c.Property(cust => cust.Name)

.HasMaxLength(50);

c.Property(cust => cust.Company)

.HasMaxLength(50);

c.Property(cust => cust.ContactTitle)

.HasMaxLength(50);

c.ToTable("Customer", "Chapter10");

});

}

}

在資料庫中,我們已經定義瞭如Listing 10-3所示的存儲過程,該存儲過程根據公司名稱和客戶標題返回符合條件的 customer

Listing 10-3. GetCustomers Returns All of the Customers with the Given Title in the Given Company.

create procedure Chapter10.GetCustomers

(@Company varchar(50),@ContactTitle varchar(50))

as

begin

select * from

chapter10.Customer where

(@Company is null or Company = @Company) and

(@ContactTitle is null or ContactTitle = @ContactTitle)

End

為了在方法中使用  GetCustomers 存儲過程,操作如下:

1. 在DbContext 子類中創建一個公開的方法(命名為GetCustomers),它接受兩個string參數,並返回Customer集合, 如 Listing 10-4所示.

Listing 10-4. A New Method to Return a Collection of Customer Objects

public ICollection<Customer> GetCustomers(string company, string contactTitle)

{

throw new NotImplementedException();

}

2.接下來實現這個GetCustomers() 方法,它調用DbContext.Database的SqlQuery方法DbContext.Database

 如Listing 10-5所示.

Listing 10-5. DbContext Subclass with GetCustomers() Implementation

public class EF6RecipesContext : DbContext

{

public DbSet<Customer> Customers { get; set; }

public EF6RecipesContext() : base("name=EF6CodeFirstRecipesContext")

{

}

protected override void OnModelCreating(DbModelBuilder modelBuilder)

{

base.OnModelCreating(modelBuilder);

modelBuilder.Types<Customer>()

.Configure(c =>

{

c.HasKey(cust => cust.CustomerId);

c.Property(cust => cust.CustomerId)

.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

c.Property(cust => cust.Name)

.HasMaxLength(50);

c.Property(cust => cust.Company)

.HasMaxLength(50);

c.Property(cust => cust.ContactTitle)

.HasMaxLength(50);

c.ToTable("Customer", "Chapter10");

});

}

 

public ICollection<Customer> GetCustomers(string company, string contactTitle)

{

return Database.SqlQuery<Customer>( "EXEC Chapter10.GetCustomers @Company,

@ContactTitle"

, new SqlParameter("Company", company)

, new SqlParameter("ContactTitle", contactTitle))

.ToList();

}

}

3.接下來的這個代碼段Listing 10-6 就是調用GetCustomers存儲過程.

Listing 10-6. Querying the Model with the GetCustomers Stored Procedure via the GetCustomers()

Method

//插入一些Customer,讓存儲過程查詢.

using (var context = new EF6RecipesContext())

{

var c1 = new Customer {Name = "Robin Steele", Company = "GoShopNow.com",

ContactTitle="CEO"};

var c2 = new Customer {Name = "Orin Torrey", Company = "GoShopNow.com",

ContactTitle="Sales Manager"};

var c3 = new Customer {Name = "Robert Lancaster", Company = "GoShopNow.com",

ContactTitle = "Sales Manager"};

var c4 = new Customer { Name = "Julie Stevens", Company = "GoShopNow.com",

ContactTitle = "Sales Manager" };

context.Customers.Add(c1);

context.Customers.Add(c2);

context.Customers.Add(c3);

context.Customers.Add(c4);

context.SaveChanges();

}

using (var context = new EF6RecipesContext())

{

var allCustomers = context.GetCustomers("GoShopNow.com", "Sales Manager");

Console.WriteLine("Customers that are Sales Managers at GoShopNow.com");

foreach (var c in allCustomers)

{

Console.WriteLine("Customer: {0}", c.Name);

}

}

以下Listing 10-6是控制台輸出結果:

============================================================================================

Customers that are Sales Managers at GoShopNow.com

Customer: Orin Torrey

Customer: Robert Lancaster

Customer: Julie Stevens

=============================================================

它是如何工作的?

為了能接收資料庫中的存儲過程里返回的實體集合,我們在DbContext子類中實現了 GetCustomers()方法,該方法用DbContext.Database.SqlQuery<T>() 來執行存儲過程 GetCustomers(它的定義見Listing 10-3). SqlQuery() 方法能用來執行返回一個結果集的 DML(數據操縱語言)語句. 該方法接收一個SQL語句的字元串。SqlQuery<T>() 泛型方法返回一個開發人員指定的強類型的實體集。

附:創建示例用到的資料庫的腳本文件

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace LambdaSample{ class Program { static void Mai...
  • 一般開發中會遇到很多需要自定義拋異常的情況,但是拋出的自定義異常又需要和其他異常(空值引用,數組越界,伺服器崩潰等)區分開,則可以用如下代碼簡單封裝。 public static void ThrowException(string exceptionMessage) { ...
  • 有時候,向服務端請求一個實體,我們希望返回如下的格式:links: [ href: http://localhost:8901/api/user/diaries/2013-08-17, rel: "self", method: "GET", isTemplated: false],currentDa...
  • 1. 用Response.Write方法代碼如下:Response.Write("");此方法缺陷就 是不能調用腳本文件中的自定義的函數,只能調用內部函數,具體調用自定義的函數只能在Response.Write寫上函數定義。比如:Response.Write("");2.用ClientScript類...
  • Console.WriteLine("start:出自http://www.cnblogs.com/ahjesus); List sourceArr = new List { 99, 51, 61, 41, 8, 73, -3, 225, 3, 10, 0 }; ...
  • 1. 用Response.Write方法 代碼如下: Response.Write(""); 此方法缺陷就是不能調用腳本文件中的自定義的函數,只能調用內部函數,具體調用自定義的函數只能在Response.Write寫上函數定 義,比如 Response.Write("");2.用Client...
  • 雖然我已經可以使用很多種編程語言進行工作,但我的工作常常會要求我快速掌握一門新的語言。我沒有選擇去閱讀幾百頁的程式手冊,而是快速瀏覽10到15頁的教程(可以在Google中搜索),並把程式語言的語法參考說明印在小卡片上(在google里搜索language to learn+reference ca...
  • C#導出PDF功能是開發中經常遇到的功能,我們採用第三方的組件,比如iTextSharp,aspose等,還能搜到一些開源的類庫,但是對於一些內容複雜樣式豐富的PDF,我們希望通過傳入一個URL直接生成一個PDF,並且不能與網頁原版差異太大,Pechkin倒是不錯,相對來說差異很小。在 Nuget ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...